解決textDidChange每次都重複發請求
專案中很多地方需要搜尋, 每次搜尋都是呼叫服務端提供的介面 . 對這些事情做個總結吧.
Q:
需求如下 ,
使用者點選搜尋欄,跳出鍵盤並輸入,每次輸入完畢, 用另一個tableview展示搜尋結果.
分析:
在iOS中無論是哪一種搜尋, 似乎直接用系統的庫UISearchbar是最簡單的.
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
利用它的回撥方法進行搜尋. 看上去真的很簡單. 哪怕控制元件麻煩一點,用UITextfield這也不會是問題 .
坑來了. 當每次text變化, 都會觸發這個方法 . 如果我在這裡傳送請求, 訪問服務端, 會出現一個問題.
通常使用者打字比較快, 會瘋狂的輸入,這裡就會瘋狂的觸發請求,導致流量,記憶體過渡的浪費了, 效能大大降低, 要重複請求這麼多次, 這肯定是不合理的####
A:
解決思路
把這些請求NSURLSessionDataTask
放到一個佇列裡, 每次執行textDidChange
方法, 先對這個佇列進行處理, cancel
之前的請求.
上程式碼
#import <Foundation/Foundation.h>
typedef void(^BlockSearchTaskComplete)(NSURLSessionDataTask *task, id responseObject) ;
@interface XTSearchHandler : NSObject
@property (nonatomic,copy) BlockSearchTaskComplete searchComplete ;
- (void)searchWithText:(NSString *)searchText ;
@end
@interface XTSearchHandler ()
@property (nonatomic,strong) NSMutableArray *arrayOfTasks ;
@property (nonatomic,strong) AFHTTPSessionManager *manager ;
@end
@implementation XTSearchHandler
- (instancetype)init
{
self = [super init];
if (self) {
self.manager = [[AFHTTPSessionManager alloc] init] ;
self.manager.responseSerializer = [AFJSONResponseSerializer serializer] ;
self.arrayOfTasks = [NSMutableArray new] ;
}
return self;
}
- (void)searchWithText:(NSString *)searchText
{
if (searchText.length >= 2)
{
/// cancel all previous tasks
[self.arrayOfTasks enumerateObjectsUsingBlock:^(NSURLSessionDataTask *taskObj, NSUInteger idx, BOOL *stop) {
[taskObj cancel] ; /// when sending cancel to the task failure: block is going to be called
}];
/// empty the arraOfTasks
[self.arrayOfTasks removeAllObjects];
/// init new task
NSURLSessionDataTask *task = [ServerRequest searchArticleTagWithSearchKey:searchText
manager:self.manager
success:^(NSURLSessionDataTask *task, id responseObject) {
self.searchComplete(task,responseObject) ;
} fail:^(NSURLSessionDataTask *task, NSError *error) {
}] ;
/// add the task to our arrayOfTasks
[self.arrayOfTasks addObject:task] ;
}
}
@end
相關文章
- vue前後端分離解決每次請求session都會變的問題Vue後端Session
- 併發請求的重複插入問題
- 日常Bug排查-Nginx重複請求?Nginx
- 重複的ajax請求讓人很受傷
- 技術分享:如何避免ajax重複請求?
- Tips_傳送請求時新增一個隨機數引數,讓瀏覽器每次都重新發請求到伺服器隨機瀏覽器伺服器
- Vue路由切換 & Axios介面取消重複請求Vue路由iOS
- React Native請求Https請求不通怎麼解決React NativeHTTP
- HTTP呼叫超時咋辦?重複請求又如何?HTTP
- 解決Git Pull,push每次都需要輸入密碼問題Git密碼
- HTTP 請求延遲解決方案HTTP
- axios請求超時解決方案iOS
- axios請求超時,設定重新請求的完美解決方法iOS
- vue帶參請求,登入時效(防止重複登陸)Vue
- 如何使POST請求具有冪等性防止重複提交 - mscharhag
- 徹底解決Asp.netCore WebApi 3.1 跨域時的預檢查204 options重複請求的問題ASP.NETNetCoreWebAPI跨域
- js ajax請求封裝及解決node請求跨域問題JS封裝跨域
- SpringBoot解決跨域請求攔截Spring Boot跨域
- 解決.bashrc檔案每次開啟終端都需要source的問題
- 使用冪等性抑制API服務中的重複請求 - tkareineAPI
- 把開發中常用class的整合成了一個包,避免每次重複複製貼上
- 前端http請求跨域問題解決前端HTTP跨域
- Ajax 跨域請求 Access to XMLHttpRequest 解決方案跨域XMLHTTP
- csrf解決Ajax請求跨站問題
- Flutter中http請求抓包解決方案FlutterHTTP
- python 使用 retrying 重試請求Python
- 解決 Laravel 接收非簡單請求時,只有收到 OPTIONS 請求的問題Laravel
- Mac 每次終端重啟都需要重新執行 source ~/bash_profileMac
- URL請求不能解決中文請求的問題
- 學習AJAX必知必會(3)~自動重啟工具nodemon、快取問題、請求超時和網路異常、取消重複請求快取
- 解決webpack不能匹配post請求的問題Web
- React 解決fetch跨域請求時session失效React跨域Session
- java解決請求跨域的兩種方法Java跨域
- 解決winform窗體重複建立問題ORM
- 解決 jquery使用ajax請求發生跨域問題的辦法jQuery跨域
- 配置 gRPC 請求的重試策略RPC
- 動態生成簡約MVC請求介面|拋棄一切註解減少重複勞動吧MVC
- 複製瀏覽器請求到Postman瀏覽器Postman
- 提示,發現重複單號,請聯絡票據神....