iOSデバイスに小さなsqlitedbがあります。ユーザーがボタンを押すと、sqliteからデータをフェッチしてユーザーに表示します。
このフェッチ部分は、バックグラウンドスレッドで実行したい(UIメインスレッドをブロックしないため)。私はそのようにします-
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
取得して少し処理した後、UIを更新する必要があります。ただし、(良い方法として)バックグラウンドスレッドからUIの更新を実行しないでください。私はselector
そうメインスレッドで呼び出す-
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
しかし、私のアプリは最初のステップでクラッシュします。つまり、バックグラウンドスレッドを開始します。これはiOSでバックグラウンドスレッドを開始する方法ではありませんか?
更新1:[self performSelectorInBackground....
このスタックトレースを取得した後、情報はありません-
更新2:私も試し、バックグラウンドスレッドをそのように開始しました
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
。
明確にするために、この操作をメインスレッドで実行すると、すべてがスムーズに実行されます...
UPDATE 3これは私がバックグラウンドから実行しようとしている方法です
- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
SpotMain *mirror = [[SpotMain alloc] init];
NSMutableArray *filteredDocids = toProceessDocids;
if(![gMediaBucket isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
if(![gMediaType isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
if(![gPlatform isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];
self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
[filteredDocids release];
[mirror release];
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
return;
}
docids
が保持されていることを確認してください。
docids
ですretain
。私はそれを入れている.h
よう@property (nonatomic, retain) NSMutableArray *docids;
get
;を付けないでください。それはちょうどする必要がありますresultSetFromDB: