繁体   English   中英

NSOperationQueue阻止了不相关的NSOperationQueue?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM