1. 程式人生 > >iOS開發中解決UIScrollView滾動時NSTimer失效的問題

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

我不知道大家在使用NSTimer的時候有沒有發現如果我們滑動ScrollView,NSTimer就會失效。我曾經遇到過這樣的問題,但需求是即使滑動scrollView,NSTimer也不能失效,於是就好好地研究了下這個問題。最終發現是NSTimer選擇的一個模式的問題。

程式碼:

[[NSRunLoopcurrentRunLoop] addTimer:self.timerforMode:NSDefaultRunLoopMode];

我們將timer新增到當前的主執行緒中,並且選擇NSDefaultRunLoopMode這個預設的模式。在選擇這個預設的模式之後,如果我們不與UI進行互動那麼NSTimer是有效的,如果我們與UI進行互動那麼主執行緒runloop就會轉到UITrackingRunLoopMode
模式下,不能處理定時器,從而定時器失效。

讓定時器不失效的方式有兩種:1.改變runloop的模式(NSRunLoopCommonModes),無論使用者是否與UI進行互動主執行緒的runloop都能處理定時器。2.開啟一個新的執行緒,讓定時器在新的執行緒中進行定義,這時定時器就會被子執行緒中的runloop處理。

程式碼:

改變runloop的模式:

self.timer = [NSTimertimerWithTimeInterval:1.0target:selfselector:@selector(updateTimer)userInfo:nilrepeats:YES];

// 新增到執行迴圈

  NSRunLoopCommonModes:佔位模式主執行緒

    [[NSRunLoopcurrentRunLoop] addTimer:self.timerforMode:NSRunLoopCommonModes]; // 如果不改變Mode模式在滑動螢幕的時候定時器就不起作用了


在子執行緒中定義定時器:

 [NSThreaddetachNewThreadSelector:@selector(bannerStart)toTarget:selfwithObject:nil];

// 在子執行緒中定義定時器

- (void)bannerStart{

self.timer = [NSTimerscheduledTimerWithTimeInterval

:1target:selfselector:@selector(updateTimer)userInfo:nilrepeats:YES];

    [[NSRunLoopcurrentRunLoop] addTimer:self.timerforMode:NSDefaultRunLoopMode];

    [[NSRunLoopcurrentRunLoop] run];

}

- (void)updateTimer

{

NSLog(@"當前執行緒:%@",[NSThreadcurrentThread]);

NSLog(@"啟動RunLoop--%@",[NSRunLoopcurrentRunLoop].currentMode);

NSLog(@"currentRunLoop:%@",[NSRunLoopcurrentRunLoop]);

dispatch_async(dispatch_get_main_queue(), ^{

self.count ++;

NSString *timerText = [NSStringstringWithFormat:@"計時器:%ld",self.count];

self.timerLabel.text = timerText;

    });

}



相關推薦

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

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

iOS開發解決Compiling IB documents for earlier than ios 7 is no longer supported的問題

問題: 在利用Xcode9執行之前的專案的時候報錯: Compiling IB documents for earlier than ios 7 is no longer supported。(編譯比ios7更早的IB文件不再受支援。) 找到報錯的

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

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

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

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

IOS開發NSTimer定時器的使用

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

完美解決ios開發兩個.framework檔案.o檔案衝突的問題(linker command failed with exit code 1 (use -v to see invocation)

專案中使用到XYPrinter.framework和Printer.framework中的兩個.o檔案有衝突, 查了資料通過拆分XYPrinter.framework刪除其中衝突的.o檔案,然後重新生成靜態庫, 解決了問題. 步驟如下: 新建一個資料夾resolveConfli

iOS開發可以節省50%編譯等待時間的解決方案

作為開發者,我們是不是經常在等待Xcode完成build的過程中,感覺iOS程式需要編譯很久,有時候,老闆迫切希望給他的手機裝上最新的版本,然後馬上出門見客戶,這個時候,你肯定是特別希望,Xcode編譯的時候,能夠快一點,我記得有一次,我就因為這個,而被老闆記住了。所以,

ios開發之檢測UIScrollView滾動方向

有時候我們需要檢測當前UIScrollView的滑動方向來做出相應的處理,可以藉助UIScrollView的delegate函式來實現, 下面的例子可以檢測到UIScrollview當前是向上滑動還是向下滑動: int _lastPosition; //A var

iOS開發】UIWebView載入html不顯示網路圖片解決辦法

NSString *html = @"<html><body><p>怎麼顯示網路圖片 <img src=\"http://p0.ifengimg.com/pmop/2017/1218/F9636BB16CC72EC34B5FCB78

ios開發資料庫升級解決方案

在iOS開發中,經常會用到sqlite,在app迭代過程中,可能會有需求變更,需求的改變可能會影響資料庫結構的改變;那麼在不丟失原有資料的同時,又要修改資料庫結構,就要進行資料遷移。 我的做法是本地儲存一個app版本號,每次app啟動都會與Info.plist裡面的版本號比

iOS開發使用NSUserDefaults儲存的物件變成null的解決辦法

問題描述:         在除錯專案的時候遇到的問題,用NSUserDefaults將一個字串寫在本地,然後就重新執行程式,但是此時用NSUserDefaults取到的值為null。 原因分析:  

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

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

解決iOS開發涉及到的retain cycle導致控制器無法釋放的問題

這幾天碰到專案中一個bug,從一個列表進入任務詳情頁面,回覆一條資訊後,會導致列表中所有的cell點選進去全都是剛剛回復的那條任務詳情。bug不細說,因為同事之前改過一個問題,有一個對列表資料賦值的操作,但是這個操作只會在介面呼叫完成後在詳情控制器裡進行,如果退出了,那麼控

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

UIScrollView滾動隱藏底部導航欄問題

art side silver iscroll trac import isp tom 底部導航 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"開始滾動"); int c

iOS開發常用的宏

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