runLoopMode:
- NSDefaultRunLoopMode:默認(rèn)的運(yùn)行模式瞎访,用于大部分操作,除了NSConnection對象事件吁恍。
- NSEventTrackingRunLoopMode:用于跟蹤觸摸事件觸發(fā)的模式(例如UIScrollView上下滾動)扒秸。
- NSRunLoopCommonModes:是一個模式集合,當(dāng)綁定一個事件源到這個模式集合的時候就相當(dāng)于綁定到了集合內(nèi)的每一個模式践盼。
例:
NSTimer* timer1 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(readTimer) userInfo:nil repeats:YES];
通過以上方法注冊NSTimer時鸦采,系統(tǒng)默認(rèn)使用NSDefaultRunLoopMode模式,于是當(dāng)界面在處理觸摸事件時咕幻,runloop處于NSEventTrackingRunLoopMode,即不會處理計時器時間顶霞,所以導(dǎo)致Timer在界面滑動等事件產(chǎn)生時不會觸發(fā)計時器肄程。
所以應(yīng)該用以下方法開啟定時器锣吼,將runLoopMode設(shè)置為NSRunLoopCommonModes。
NSTimer* timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(readTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
同理蓝厌,在進(jìn)行網(wǎng)絡(luò)請求時玄叠,返回參數(shù)處理也默認(rèn)使用NSDefaultRunLoopMode模式,通過以下方法即可解決該問題
NSURLConnection *connection = [[NSURLConnection alloc]
initWithRequest:request
delegate:self
startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];//修改mode
[connection start];
AFNetworking框架中對返回參數(shù)的處理默認(rèn)使用NSRunLoopCommonModes拓提,所以不用擔(dān)心這個問題读恃。
適用runloop的場合:
- 使用port或是自定義的input source來和其他線程進(jìn)行通信
- 在線程(非主線程)中使用timer
- 使用 performSelector…系列(如performSelectorOnThread, …)
- 使用線程執(zhí)行周期性工作