2

私はこのコードを使用しています:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{

//saving stuff to NSUserDefaults

});

コードが2回連続して呼び出されない限り機能し、その時点でクラッシュします。それが言うのはThread 7: trace、の画面でのクラッシュのためだけCFRetainです。

キューが終了しない限り、このルーチンの再起動を許可するべきではないと推測しています。しかし、多くのパラメーターのどれを変更するかはわかりません。優先度を高くする必要はありません。また、グローバルキューである必要もありません。正直なところ、スレッドプログラミングには、これらすべてを特定するのに時間がかかるので、誰かが私を指摘してくれることを期待しています。正しい方向。

4

2 に答える 2

3

グローバルキューは本質的に同時です。これらのキューに移動するdispatch_sync()と、ブロックの実行が完了すると関数が戻ることを意味します。そのキューのブロックが同時に実行されないことを保証するものではありません

シリアルキューを作成dispatch_queue_create()し(シリアルオプションを使用)、ブロックをそのキューにディスパッチします。disptch_sync()そのキューで実行されているブロックからキューに入らないように注意してください。デッドロックが発生します。

于 2012-08-09T13:41:22.953 に答える
2

この操作を非同期で実行したいが、常に同じキューで実行したい場合(つまり、バックグラウンドで実行されますが、同時に2回実行されることはありません)、dispatch_queue_tクラス内(またはメソッドの外部でグローバルにアクセス可能な場所)にを作成することをお勧めします。

それは次のようになります:

@interface Foo : Bar {

    @private
    dispatch_queue_t _savingQueue = dispatch_queue_create("savingQueue", NULL);

}

-(void)saveStuff;

@end

常にそのキューに保存します

-(void)saveStuff{

    dispatch_async(_savingQueue, ^{

    //saving stuff to NSUserDefaults

    });

}
于 2012-08-09T14:32:06.423 に答える