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];
// 新增到執行迴圈
[[NSRunLoopcurrentRunLoop] addTimer:self.timerforMode:NSRunLoopCommonModes]; // 如果不改變Mode模式在滑動螢幕的時候定時器就不起作用了
在子執行緒中定義定時器:
[NSThreaddetachNewThreadSelector:@selector(bannerStart)toTarget:selfwithObject:nil];
// 在子執行緒中定義定時器
- (void)bannerStart{
self.timer = [NSTimerscheduledTimerWithTimeInterval
[[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]] ||