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 では、startNewEndlessBackgroundTask を 2 回呼び出した後、画像の読み込みがブロックされます。どちらもiOS 6を実行しています。
アプリのメイン ループがブロックされていません。
代わりに performSelectorInBackground を使用して takeTime を呼び出すと、すべてがブロックされることなく正常に動作し、バックグラウンドでも takeTime ルーチンが適切に動作します。
2 つの NSOperationQueue が完全に別々に割り当てられ、依存関係がない場合、なぜこれが起こるのでしょうか? 私にとって、この単純な方法で NSOperationQueue を使用することと performSelectorInBackground を使用することの間に違いはないはずですが、誤解している基本的なものがあると思いますか?