国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

IOS開發(fā)中NSRunloop跟NSTimer的問題

2019-11-14 20:42:46
字體:
供稿:網(wǎng)友

在Windows時代,大家肯定對SendMessage,PostMessage,GetMessage有所了解,這些都是windows中的消息處理函數(shù),那對應在ios中是什么呢,其實就是NSRunloop這個東西。在ios中,所有消息都會被添加到NSRunloop中,分為‘input source’跟'timer source'種,并在循環(huán)中檢查是不是有事件需要發(fā)生,如果需要那么就調(diào)用相應的函數(shù)處理。

我們在使用NSTimer的時候,可能會接觸到runloop的概念,下面是一個簡單的例子:

 1 - (void)viewDidLoad 2 { 3     [super viewDidLoad]; 4     // Do any additional setup after loading the view, typically from a nib. 5     NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 6                                               target:self 7                                             selector:@selector(PRintMessage:) 8                                             userInfo:nil 9                                              repeats:YES];10 }

這個時候如果我們在界面上滾動一個scrollview,那么我們會發(fā)現(xiàn)在停止?jié)L動前,控制臺不會有任何輸出,就好像scrollView在滾動的時候?qū)imer暫停了一樣,在查看相應文檔后發(fā)現(xiàn),這其實就是runloop的mode在做怪。
runloop可以理解為cocoa下的一種消息循環(huán)機制,用來處理各種消息事件,我們在開發(fā)的時候并不需要手動去創(chuàng)建一個runloop,因為框架為我們創(chuàng)建了一個默認的runloop,通過[NSRunloop currentRunloop]我們可以得到一個當前線程下面對應的runloop對象,不過我們需要注意的是不同的runloop之間消息的通知方式。

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

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

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

說到這里,在http異步通信的模塊中也有可能碰到這樣的問題,就是在向服務器異步獲取圖片數(shù)據(jù)通知主線程刷新tableView中的圖片時,在tableView滾動沒有停止或用戶手指停留在屏幕上的時候,圖片一直不會出來,可能背后也是這個runloop的mode在做怪,嘿嘿。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宕昌县| 清远市| 抚远县| 高台县| 万山特区| 司法| 泗水县| 中西区| 湖南省| 迁西县| 郯城县| 汪清县| 垫江县| 仁布县| 洛扎县| 美姑县| 高陵县| 石阡县| 河池市| 丽江市| 东方市| 溆浦县| 蓬莱市| 太谷县| 大荔县| 布尔津县| 夏河县| 绥化市| 清流县| 香港| 盘锦市| 涞源县| 广饶县| 柳州市| 秀山| 香格里拉县| 团风县| 温州市| 关岭| 汶上县| 贵定县|