1. 程式人生 > >IOS開發中滑動頁面時NSTimer停止的問題

IOS開發中滑動頁面時NSTimer停止的問題

我們在做倒計時的時候,發現當你手指按著螢幕不放,拖動tableView滑動的時候,寫在cell上得倒計時停止倒計時,鬆開繼續倒計時。研究發現就是拖動tableView滑動時,NSTimer停止了。

這其實就是runloop的mode在做怪。
runloop可以理解為cocoa下的一種訊息迴圈機制,用來處理各種訊息事件,我們在開發 的時候並不需要手動去建立一個runloop,因為框架為我們建立了一個預設的runloop,通過[NSRunloop currentRunloop]我們可以得到一個當前執行緒下面對應的runloop物件,不過我們需要注意的是不同的runloop之間訊息的通知方式。

接著上面的話題,在開啟一個NSTimer實質上是在當前的runloop中註冊了一個新的事件源,而當scrollView滾動的時候,當前的 MainRunLoop是處於UITrackingRunLoopMode的模式下,在這個模式下,是不會處理NSDefaultRunLoopMode 的訊息(因為RunLoop Mode不一樣),要想在scrollView滾動的同時也接受其它runloop的訊息,我們需要改變兩者之間的runloopmode.

1 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

簡單的說就是NSTimer不會開啟新的程序,只是在Runloop裡註冊了一下,Runloop每次loop時都會檢測這個timer,看是否可 以觸發。當Runloop在A mode,而timer註冊在B mode時就無法去檢測這個timer,所以需要把NSTimer也註冊到A mode,這樣就可以被檢測到。

一個簡單例子,建立NSTimer進行倒計時時,修改model:

- (id)initWithTimeout:(NSInteger)total {
    if (self = [self init]) {
        self.counter = total;
        
if (total > 0) { self.countdown = YES; // Notice: scheduledTimerWithTimeInterval adds the timer to the current thread's run loop timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countingDown:) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; return self; } } return self; }

說到這裡,在http非同步通訊的模組中也有可能碰到這樣的問題,就是在向伺服器非同步獲取圖片資料通知主執行緒重新整理tableView中的圖片時,在 tableView滾動沒有停止或使用者手指停留在螢幕上的時候,圖片一直不會出來,可能背後也是這個runloop的mode在做怪。

相關推薦

IOS開發滑動頁面NSTimer停止的問題

我們在做倒計時的時候,發現當你手指按著螢幕不放,拖動tableView滑動的時候,寫在cell上得倒計時停止倒計時,鬆開繼續倒計時。研究發現就是拖動tableView滑動時,NSTimer停止了。 這其實就是runloop的mode在做怪。runloop可以理解為cocoa下的一種訊息迴圈機制,用來處理各種

iOS開發解決UIScrollView滾動NSTimer失效的問題

我不知道大家在使用NSTimer的時候有沒有發現如果我們滑動ScrollView,NSTimer就會失效。我曾經遇到過這樣的問題,但需求是即使滑動scrollView,NSTimer也不能失效,於是就

IOS開發NSTimer定時器的使用

第一步:呼叫函式 [self getCircleBackGround:self.blcView.btChartView.mCircleView getCurrentLb:self.blcView.btChartView.mCurrent ]; 第二步:方法的實現 -(voi

iOS開發ViewController的頁面跳轉和彈出模態

ViewController 頁面跳轉 從一個Controller跳轉到另一個Controller時,一般有以下2種:  1、利用UINavigationController,呼叫pushViewController,進行跳轉;這種採用壓棧和出棧的方式,進行Control

iOS開發本地資料儲存的 ios登入成功後將使用者的資料儲存到本地 下次開啟應用不用重複登入了

// 利用沙盒根目錄拼接”Documents”字串 NSString *homePath = NSHomeDirectory(); NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; 但是不建議使用這種方法,

JAVA開發頁面post提交的資料後臺通過request取出是空的,所有引數都消失了

這兩天調查一個問題,一個特定的製造編號檢索出623條資料,並顯示在頁面上。然後再把資料提交時,後臺報空指標,除錯後發現request中是空的,所有引數都消失了!換其它的製造編號就不會出現這個問題,開始以為是資料不同,走了不同分支,多次檢查資料和程式碼後並沒有發現問題。頁面程

iOS開發地圖與定位

視圖 編寫 aps 簡單 -a 第三方 span spa margin   不管是QQ還是微信的移動client都少不了定位功能,之前在微信demo中沒有加入定位功能,今天就寫個定位的小demo來了解一下定位和地圖的東西。地圖和定位看上去是挺高大上一東西。其有使用方法比

iOS開發,獲取iOS設備型號

bsp ios設備型號 isequal uid eve ide inf turn res 1、首先要導入頭文件   #import <sys/utsname.h> 2、代碼如下 - (NSString *)getDeviceVersionInfo{

iOS開發訪問相冊攝像像頭

created med res erro warn setup 上進 normal animate iOS開發中訪問相冊攝像像頭 源代碼下載地址http://download.csdn.net/download/jingjingxujiayou/7270479 在App

[iOS]怎樣在iOS開發切換顯示語言實現國際化

art out title oca standard 文件 creat mit 工具類 1.在Project設置,加入中英兩種語言:2.新建Localizable.strings文件,作為多語言相應的詞典,存儲多種語言,點擊右側Localization,勾選中英:3.加入

iOS開發的NSDateFormatter日期格式解析總結

星期四 class con 數字 september february 月份 mil ios開發 在工作中,常常遇到將時間解析出來轉換成自己相應要求的時間格式,之前也有收集相應的轉換格式,如今將自己收集的一部分了做個分享,應該比較完好了,歡迎大家繼續補充 年 y

iOS開發常用的宏

tar lin iter standard ffi ant height same alt OC對象判斷是否為空? 字符串是否為空 #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull class]] ||

再續iOS開發的這些權限

tle store start 打開 帶來 tty 受限 bsp 不同的 前言 上篇文章iOS開發中的這些權限,你搞懂了嗎?介紹了一些常用權限的獲取和請求方法,知道這些方法的使用基本上可以搞定大部分應用的權限訪問的需求。但是,這些方法並不全面,不能涵蓋住所有權限訪問的方

iOS開發 打印CGRect用NSStringFromCGRect

字節 科學 nbsp cal 整型 string cgrect 計算 some NSLog(@"%@",NSStringFromCGRect(pickerView.frame)); 或者 CFShow(NSStringFromCGRect(pickerView.fram

iOS開發“此證書的簽發者無效”的解決方式

courier data display sina 新浪微博 tracking 項目 text 輸入 iOS開發過程中有時候會出現證書所有變成無效,例如以下圖 然後進行打包的時候會提演示樣例如以下警告: 解決方法: 第一步: 下載ht

iOS開發多線程基礎

推斷 傳遞 cti self reads priority cal default value 耗時操作演練 代碼演練 編寫耗時方法 - (void)longOperation { for (int i = 0; i <

iOS 開發的幾種設計模式

設計模式 開發 模式 ios 設計 iOS 開發中的幾種設計模式

iOS開發的position+anchorPoint與frame應用解釋

移動 pos 限制 一起 frame -1 必須 posit 解釋 我剛開始時非常困惑這兩個地方, 所以現在好好解釋一下他們的聯系. 1/ position與anchorPoint是一對屬性, 經常一起設置來確定控件的位置 frame單獨設置 2/ position

iOS開發指紋識別簡單介紹

Owner rep nsthread 進行 dao self tex 簡單 min 中指紋識別簡單介紹,在iphone系列中,是從5S以後開始有了指紋識別的功能,在ios8的時候開放的指紋驗證的接口。 所以我們在進行指紋識別應用的時候要去判斷機型以及系統的版本。 代

iOS 開發類似上下滾動彈幕實現原理

tarray void ddr 列表 fse post mar ati poi #mark ---滾動彈幕 列表中留有7條記錄 大於7條時刪除並指引表視圖向上滑動 - (void)addRowActionWithContent:(NSString *)str {