在iOS中创建自己的完成块

Fog*_*ter 6 objective-c grand-central-dispatch ios

我有一个对象需要很长时间来做一些事情(它从服务器下载数据).

如何编写自己的完成块以便我可以运行...

[downloader doSomeLongThing:^(void) {
    //do something when it is finished
}];
Run Code Online (Sandbox Code Playgroud)

我不确定如何在下载程序对象中保存此块.

小智 10

您可以复制块然后调用它:

typedef void (^CallbackBlk)();

@property (copy) CallbackBlk cb;

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

    // etc.
}

// when finished:
self.cb();
Run Code Online (Sandbox Code Playgroud)


Mat*_*ong 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);
    });
}
Run Code Online (Sandbox Code Playgroud)

然后你就像你指定的那样实现它:

[downloader doSomeLongThing:^(void) {
    // do something when it is finished
}];
Run Code Online (Sandbox Code Playgroud)