我正在測試標準運行循環(由XCode創建)應用程序。我的應用有2個按鈕:
運行循環不會繼續事件
Start Loop
- 在某些模式下啓動runloop(見下面的代碼);Stop Loop
- 更改self.stop
標誌停止runloop。
`
- (IBAction)stopLoop:(id)sender
{
self.stop = YES;
}
- (IBAction)startLoop:(id)sender
{
self.stop = NO;
do
{
[[NSRunLoop currentRunLoop] runMode:runLoopMode beforeDate:runLoopLimitDate];
if (self.stop)
{
break;
}
} while (YES);
}
`
其中:
1. runLoopMode
是預定義模式(I嘗試每個,默認情況下,事件跟蹤,莫代爾,連接)中的一個。
2. runLoopLimitDate
[NSDate distantFuture]或[NSDate distantPast]或關閉功能。
3. self.stop
標誌被安裝在按鈕調用的其他方法中。
就是這樣,我的應用程序沒有任何其他代碼。
AFAIU,runloop模式是一組事件源。所以,如果我在某種模式下運行runloop,runloop將會繼續那些與這種模式相關的事件源。
默認情況下,Cocoa在默認模式下運行runloop,並且所有事件都會大幅度進行。但是當用戶按下startLoop
按鈕時,我的應用凍結:
。
startLoop
方法永遠不會打破這個無限循環。應用程序不會向我發送任何事件,因此UI凍結並且用戶無法按stopLoop
按鈕。如果我運行Core Foundation對應項,也會出現同樣的問題。
但,當我嘗試接收通過的NSApplication方法nextEventMatchingMask:untilDate:inMode:dequeue:
(的NSWindow)事件,並通過相同模式,我收到UI事件。
- (IBAction)startLoop:(id)sender
{
self.stop = NO;
do
{
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSEventTrackingRunLoopMode dequeue:YES];
if (event == nil)
{
break;
}
[NSApp sendEvent:event];
if (self.stop)
{
break;
}
} while (YES);
}
有問題:「爲什麼?如果我跑默認的運行循環模式,或者一些其他的,這樣,我不能接受的事件」
感謝您的建議。
你可能需要澄清你到底在做什麼。例如,如果其他方法從不設置self.stop,會發生什麼? – Volker
謝謝,我更新了我的問題。 – Lexandr
您只是以這種方式阻止了runloop,限制日期意味着在此之前runloop被阻止。您的循環會立即重置,從而再次阻塞。停止按鈕永遠不會發生更改以發送其操作。你想實現什麼? – Volker