解決textDidChange每次都重復(fù)發(fā)請(qǐng)求

項(xiàng)目中很多地方需要搜索, 每次搜索都是調(diào)用服務(wù)端提供的接口 . 對(duì)這些事情做個(gè)總結(jié)吧.

Q:

需求如下 ,
用戶點(diǎn)擊搜索欄,跳出鍵盤并輸入,每次輸入完畢, 用另一個(gè)tableview展示搜索結(jié)果.

分析:

在iOS中無(wú)論是哪一種搜索, 似乎直接用系統(tǒng)的庫(kù)UISearchbar是最簡(jiǎn)單的.

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

利用它的回調(diào)方法進(jìn)行搜索. 看上去真的很簡(jiǎn)單. 哪怕控件麻煩一點(diǎn),用UITextfield這也不會(huì)是問(wèn)題 .

坑來(lái)了. 當(dāng)每次text變化, 都會(huì)觸發(fā)這個(gè)方法 . 如果我在這里發(fā)送請(qǐng)求, 訪問(wèn)服務(wù)端, 會(huì)出現(xiàn)一個(gè)問(wèn)題.

通常用戶打字比較快, 會(huì)瘋狂的輸入,這里就會(huì)瘋狂的觸發(fā)請(qǐng)求,導(dǎo)致流量,內(nèi)存過(guò)渡的浪費(fèi)了, 性能大大降低, 要重復(fù)請(qǐng)求這么多次, 這肯定是不合理的####


A:

解決思路
把這些請(qǐng)求NSURLSessionDataTask放到一個(gè)隊(duì)列里, 每次執(zhí)行textDidChange方法, 先對(duì)這個(gè)隊(duì)列進(jìn)行處理, cancel之前的請(qǐng)求.

上代碼


#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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,390評(píng)論 4 61
  • (序言) 那年,那月,那日,那時(shí),那地,那人,那景,那話,那一幕幕。 那個(gè)冬季,我站在漫天飛舞的雪花里,你說(shuō)過(guò)的純...
    古小楓閱讀 742評(píng)論 3 3
  • 1,n=2,m=3,請(qǐng)將n和m的值互換。①,int t; t=n; n=m; m=t;(最常用的方式)②,n=...
    敬java靖閱讀 218評(píng)論 0 1

友情鏈接更多精彩內(nèi)容