在NSRunLoop的Apple文檔中,有示例代碼演示暫停執行,同時等待某個標誌由其他設置。讓NSRunLoop等待標誌被設置的最佳方式?
BOOL shouldKeepRunning = YES; // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
我一直在使用這個,它的工作原理,但在調查性能問題,我跟蹤到這段代碼。我使用幾乎完全相同的代碼(只是國旗的名稱是不同的:),如果我在設置標誌(在另一種方法中)之後在線上放置NSLog
,然後在while()
之後有一行看似在幾秒鐘的兩個日誌語句之間隨機等待。
延遲在較慢或較快的機器上似乎並不不同,但從運行到運行至少有幾秒鐘和多達10秒不等。
我已經用下面的代碼解決了這個問題,但原始代碼不起作用似乎不正確。
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
使用此代碼時,設置標誌和while循環後的日誌語句現在始終小於0.1秒。
任何人有任何想法,爲什麼原代碼表現出這種行爲?
我想你是誤會文檔中給出的示例;這個示例代碼的用法是當你想終止一個runloop的執行時(不要得到關於標誌變化的通知)https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/ NSRunLoop_Class/Reference/Reference.html#// apple_ref/occ/instm/NSRunLoop/run – kernix 2014-04-18 20:06:40