データベースのフェッチをバックグラウンドで実行する方法を見つけようとしています。以下は、同じ関数のフォアグラウンド バージョンとバックグラウンド バージョンです。フォアグラウンド バージョンが動作します。しかし、バックグラウンド バージョンでは、ローカル変数 retval が割り当てられることはありません。pageInfoForPageKey 関数にブレークポイントを設定すると、関数が呼び出されないことがわかります。
ブロック内で self は使用可能ですか?
//foreground version
- (PageInfo*)objectAtIndex:(NSInteger)idx
{
return [[self dataController] pageInfoForPageKey:[[[self pageIDs] objectAtIndex:idx] integerValue]];
}
//background version
- (PageInfo*)objectAtIndex:(NSInteger)idx
{
__block PageInfo* retval = nil;
__block NSInteger pageID = [[[self pageIDs] objectAtIndex:idx] integerValue];
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(aQueue, ^{
retval = [[self dataController] pageInfoForPageKey:pageID];
});
return retval;
}