2012-02-21 13 views
2

UIオブジェクトでの作業が安全でないかどうかはわかりません。 NSOperationとNSOperationQueueを使用して別のキューに移動したコードがあります。私は非安全なコードをクリーンアップする必要があり、このaccross走ったところ私が検討しています:バックグラウンドスレッドでUIオブジェクトをインスタンス化するのは安全ですか?

alertNoDatabaseSelected = [[[UIAlertView alloc] 
    initWithTitle:NSLocalizedString(@"You Haven't Enabled Any Databases", nil) 
    message:[NSString stringWithFormat:NSLocalizedString(@"You can't search unless you choose at least one database in your settings.", nil), self.currentSearchEntity.keywords] 
    delegate:self cancelButtonTitle:NSLocalizedString(@"Settings", nil) 
    otherButtonTitles:nil] autorelease]; 
[alertNoDatabaseSelected show]; 

は、メインスレッドのこれらの行危険な外の両方ありますか?私はいくつかのクラッシュする動作をしており、これはリファクタリングの最初のタイプのように見えます。

更新 これはもっと大きな懸念事項である可能性があります。私は2つのNSManagedObjectContextを持っています。一つはemainスレッドに、もう一つは別のスレッドにあります。これらのコンテキストを同期すると、多くのUI更新(特にテーブルビュー)が発生する可能性があります。私は、同期がメインスレッド上で自動的にすべてを蹴飛ばすかどうかを確認するために特別な対策を講じる必要があるかどうか、あるいはそのようにするために何かをしなければならないかどうかを知りたいですか? (これについて別の質問を書く必要があるかもしれません。)

答えて

1

2番目の行は確かにメインスレッド外では安全ではありません。 alloc自体はセカンダリスレッドでは問題ありませんが、init...メソッドがあるかどうかわかりませんが、安全ではないという慎重な前提があります。

すべてのUI更新をメインスレッドでスケジュールする必要があります。 NSOperationオブジェクトとしてスケジュールする場合は、[NSOperationQueue mainQueue]を使用できます。

+1

これらのブロックを処理するためにdispatch_async(dispatch_get_main_queue()、^ {...})を使用します。 – Jim

関連する問題