我正在使用 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];
}];
}
这完全阻止了我在 iPhone4 上加载图像的其他 NSOperationQueue。在 iPhone4s 上,它会在 2 次调用 startNewEndlessBackgroundTask 后阻止我的图像加载。两者都运行 iOS 6。
我的应用程序的主循环没有被阻塞。
如果我改为使用 performSelectorInBackground 来调用 takeTime,则一切正常,没有阻塞,并且 takeTime 例程也可以在后台正常工作。
当两个 NSOperationQueue 完全分开分配初始化并且没有依赖关系时,为什么会发生这种情况?对我来说,以这种简单的方式使用 NSOperationQueue 和使用 performSelectorInBackground 之间应该没有区别,但我想我误解了一些基本的东西?