2015-07-03 33 views
1

我有一些關於NSRunLoop的問題。當如下運行代碼時,主線程似乎停止,並且它不會在while循環之後運行代碼。 我想知道什麼時候 [NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate的distantFuture] 進行,發生什麼事在mainthread的runloop?我們知道UI mainthread'runloop在應用程序啓動時自動運行,主線程是睡眠還是死循環?「[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]」do?

while (!self.runLoopThreadDidFinishFlag) { 
    NSLog(@"Begin RunLoop"); 

    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 

    NSLog(@"End RunLoop"); 
} 

回答

2
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]] 

代碼此行只是讓線程執行循環的源一次,如果沒有任務,它返回immediately.So這些代碼不會阻止你的主要thread.Mainthread的runloop自動運行意味着主線程保持一段時間循環,一次又一次地執行[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]。當它運行到你自己的同時圈while (!self.runLoopThreadDidFinishFlag)狀態可能總是正確的,可能會阻塞線程。你自己的代碼[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]這意味着執行一次循環的源代碼或清理runloop源代碼中的任務,如果有一個任務更改self.runLoopThreadDidFinishFlag那麼你的代碼將繼續運行。

所以[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]while圈使mainthread有機會goto執行其他代碼,可能會改變runLoopThreadDidFinishFlag

PS。 [NSRunLoop run]runMode:beforeDate:有很大不同,您可能會感到困惑。 NSRunLoop apple document