我有一个对象,需要很长时间才能做一些事情(它从服务器下载数据)。
如何编写自己的完成块以便我可以运行...
[downloader doSomeLongThing:^(void) {
//do something when it is finished
}];
我不确定如何在下载程序对象中保存此块。
答案 0 :(得分:10)
您可以复制该块然后调用它:
typedef void (^CallbackBlk)();
@property (copy) CallbackBlk cb;
- (void)doSomething:(CallbackBlk)blk
{
self.cb = blk;
// etc.
}
// when finished:
self.cb();
答案 1 :(得分: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
}];