[英]NSOperationQueue blocking unrelated NSOperationQueue?
我正在使用NSOperation和NSOperationQueue(對於2D游戲)在后台加載圖像。
為了理解NSOperations的行為,我嘗試添加以下不相關的NSOperationQueue / NSOperation(在開始加載任何圖像之前,我調用-startNewEndlessBackgroundTask方法):
static int stop = NO;
static int c = 1000;
-(void)takeTime {
stop = NO;
while (!stop) {
for (int i = 0; i < 10000; i++) {
c += 1;
}
c = c;
}
}
-(void)stopBackgroundTask {
stop = YES;
}
-(void)startNewEndlessBackgroundTask {
//[self performSelectorInBackground:@selector(takeTime) withObject:nil];
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
[self takeTime];
}];
}
這完全阻塞了我的其他NSOperationQueue,無法在iPhone4上加載圖像。 在iPhone4s上,它在兩次調用startNewEndlessBackgroundTask之后阻止了我的圖像加載。 兩者都在運行iOS 6。
我的應用程序的主循環未被阻止。
如果我改為使用performSelectorInBackground來調用takeTime,則一切正常,沒有阻塞,並且takeTime例程在后台也正常運行。
當兩個NSOperationQueue分別完全初始化分配並且沒有依賴關系時,為什么會發生這種情況? 對我來說,以這種簡單的方式使用NSOperationQueue與使用performSelectorInBackground之間應該沒有區別,但是我想我有一些基本誤解嗎?
不確定細節,但這只是我現在認為正在發生的事情的部分答案。
NSOperation在下面使用GCD(至少從OSX和iOS的最后幾個版本開始)。 GCD中有某些全局優先級隊列。
當高優先級隊列中有任務時,低優先級隊列中的任務甚至都不會啟動(盡管同一全局優先級隊列中的任務可以啟動,因為盡管名稱中有“ queue”,但默認優先級隊列中的任務仍可以啟動)並發)。
由於我沒有指定任何線程優先級,因此我想將-takeTime操作安排在默認優先級隊列中,並將圖像加載操作安排在默認低優先級隊列中。 這可以解釋為什么-takeTime操作阻止了我的圖像加載。
這並沒有真正解釋的原因是為什么要花兩個-takeTime操作來阻止我在iPhone 4s上的圖像加載操作,因為低優先級隊列中的任務沒有等待高優先級隊列中的任務,這取決於CPU核數-據我在文檔中所見。
Apple-Dispatch Queues :“除了獲取默認的並發隊列之外,您還可以通過將DISPATCH_QUEUE_PRIORITY_HIGH和DISPATCH_QUEUE_PRIORITY_LOW常量傳遞給函數來獲取具有高優先級和低優先級級別的隊列,或者通過將DISPATCH_QUEUE_PRIORITY_BACKGROUND傳遞給后台隊列如您所料,高優先級並發隊列中的任務先於默認隊列和低優先級隊列中的任務執行。類似地,默認隊列中的任務先於低優先級隊列中的任務執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.