6

私はいくつかのことをするのに長い時間がかかるオブジェクトを持っています(それはサーバーからデータをダウンロードします)。

実行できるように独自の完了ブロックを作成するにはどうすればよいですか...

[downloader doSomeLongThing:^(void) {
    //do something when it is finished
}];

このブロックをダウンローダーオブジェクトに保存する方法がわかりません。

4

2 に答える 2

10

ブロックをコピーしてから呼び出すことができます。

typedef void (^CallbackBlk)();

@property (copy) CallbackBlk cb;

- (void)doSomething:(CallbackBlk)blk
{
    self.cb = blk;

    // etc.
}

// when finished:
self.cb();
于 2013-01-29T15:46:30.693 に答える
7

コールバックでパラメータを使用していないため、標準のdispatch_block_tを使用できます。また、長いプロセスが完了したときにコールバックしたいだけなので、プロパティで追跡する必要はありません。あなたはこれを行うことができます:

- (void)doSomeLongThing:(dispatch_block_t)block
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Perform really long process in background queue here.

        // ...

        // Call your block back on the main queue now that the process 
        // has completed.
        dispatch_async(dispatch_get_main_queue(), block);
    });
}

次に、指定したとおりに実装します。

[downloader doSomeLongThing:^(void) {
    // do something when it is finished
}];
于 2013-01-29T16:44:04.727 に答える