私のアプリは、ほぼ 64 のローカル通知をスケジュールする必要がある場合があり、iPhone4 でメイン スレッドがほぼ 1 秒間ブロックされます。これを別のスレッドで実行したいのですが、これらのローカル通知はUIApplcation
スレッドセーフのメソッドを操作していますか?
2 に答える
ドキュメントには明示的に記載されておらず、UIKitは一般的に大部分がスレッドセーフではないため、そうは思わないでください
しかし、試してみる価値はあります:Dメインスレッドはdispatch_asyncだけ離れています;)
--- それらを個別にスケジュールし、その間にメインループを実行するオプションになるかもしれません
スレッド セーフと、バックグラウンド スレッドからの UIKit の呼び出しの 2 つが関係しています。一部の UIKit コードは、バックグラウンド スレッドから呼び出されることをまったく好まないため、そうしようとすると例外がスローされます (新しいコンテンツを に設定する場合などUITextView
)。つまり、コードには次のようなものがあります。
NSParameterAssert([NSThread isMainThread],
@"This method must be called from the main thread.");
次に、スレッドセーフです。バックグラウンド スレッドからコードを呼び出すことができる場合でも、そうするとバグが発生する可能性がある方法で記述されている可能性があります。
- (void) doA {
for (id item in allItemsArray) {
// do something
}
}
- (void) doB {
[allItemsArray addObject:@"foo"];
}
1 つのスレッドが-doA
呼び出され、その間に別のスレッドが呼び出されると、列挙中に-doB
を変更したため、アプリが例外でクラッシュします。allItemsArray
したがって、最初の質問は、通知メソッドをバックグラウンド スレッドで呼び出すことができるかどうかです。できると思います。その場合、バックグラウンド キューからすべての通知をスケジュールするだけです。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<64; i++) {
// schedule notification
}
});
アプリの別の部分がその間に他のローカル通知をスケジュールしていない限り、スレッド セーフを気にする必要はありません。存在する場合は、別のキューを作成してすべての通知呼び出しコードをシリアル化するか、メソッドが実際にスレッドセーフであることを確認する必要があります (その場合、提供する信頼できるリソースはありません)。