[解決済み] iOSのBackground Threadの起動
質問
iOSデバイスに小さなsqlitedbを持っています。ユーザーがボタンを押すと、sqliteからデータを取得し、それをユーザーに表示します。
このフェッチ部分は、バックグラウンドスレッドで行いたいと思います(UIメインスレッドをブロックしないため)。私はこれを次のように行います。
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
フェッチ&アンプ;少し処理した後、私はUIを更新する必要があります。しかし、(グッドプラクティスとして)バックグラウンドスレッドからUI更新を行うべきではありません。私は
selector
をメインスレッドで呼び出します。
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
しかし、私のアプリは最初のステップ、すなわちバックグラウンドスレッドを開始するところでクラッシュします。これはiOSでバックグラウンドスレッドを開始する方法ではないのでしょうか?
UPDATE 1:
その後
[self performSelectorInBackground....
私はこのスタックトレースを取得し、これまで何の情報もない - 。
アップデイト2。
バックグラウンドスレッドを立ち上げて、こんな感じにしてみました。
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
しかし、まだ私は同じスタックトレースを取得します。
はっきりさせておきたいのですが、メインスレッドでこの操作を実行すると、すべてがスムーズに実行されます...
アップデイト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;
}
どのように解決するのですか?
もし
performSelectorInBackground:withObject:
を使って新しいスレッドを生成する場合、実行されたセレクタは新しいスレッドの自動解放プール、実行ループ、その他の設定の詳細を設定する責任を負います - 詳しくは
NSObject を使用してスレッドを生成する」を参照してください。
を参照してください。
スレッド プログラミング ガイド
.
おそらく グランド・セントラル・ディスパッチ を使ったほうがいいでしょうね。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self getResultSetFromDB:docids];
});
GCDは新しい技術で、メモリのオーバーヘッドとコード行数の点でより効率的です。
更新 に脱帽。 クリス・ノレット は、上記のコードをよりシンプルにし、Apple の最新の GCD コード例を維持するための変更を提案しました。
関連
-
[解決済み】Android "ビュー階層を作成した元のスレッドだけが、そのビューに触れることができる"
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] スレッドを強制終了させる方法はありますか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み】iOSアプリの名前を変更する方法は?
-
[解決済み] NSArrayのディープコピー
-
[解決済み] キューに入れられたperformSelector:afterDelayの呼び出しをキャンセルする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Xcode 4でNSZombieEnabledを設定するにはどうすればよいですか?
-
[解決済み] 現在の日付から7日分を差し引いた日数
-
[解決済み] Objective-Cのクラス→文字列のようなものです。[NSArray className] -> @"NSArray" のようになります。
-
[解決済み] error: Writeable atomic property cannot pair with synthesized setter/getter and the user defined setter/getter.
-
[解決済み] NSPredicate: NSDateプロパティの日によるオブジェクトのフィルタリング
-
[解決済み] Objective-Cです。カテゴリ内のプロパティ/インスタンス変数
-
[解決済み] 複数のサブクラスで1つのストーリーボードuiviewcontrollerを使用する方法
-
[解決済み] ARCを使用する場合、deallocでプロパティをnilに設定するのですか?
-
[解決済み] なぜObjective-Cはプライベートメソッドをサポートしないのですか?
-
[解決済み] ベストプラクティス - 自分のプロジェクト/アプリのためのNSErrorドメインとコード