gpt4 book ai didi

iphone - NSOperationQueue阻止了不相关的NSOperationQueue?

转载 作者:行者123 更新时间:2023-12-01 16:51:50 25 4
gpt4 key购买 nike

我正在使用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常量来获取后台队列。可以预期,高优先级并发队列中的任务先于默认和低优先级队列中的任务执行。同样,默认队列中的任务先于低优先级队列中的任务执行。”

关于iphone - NSOperationQueue阻止了不相关的NSOperationQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14980787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com