我有一个对象需要花费很长时间来完成某些任务(例如从服务器下载数据)。
我该怎么写自己的完成块,以便我可以在对象完成任务时运行它...
[downloader doSomeLongThing:^(void) { //do something when it is finished}];
我不确定如何将此块保存在下载器对象中。
我有一个对象需要花费很长时间来完成某些任务(例如从服务器下载数据)。
我该怎么写自己的完成块,以便我可以在对象完成任务时运行它...
[downloader doSomeLongThing:^(void) { //do something when it is finished}];
我不确定如何将此块保存在下载器对象中。
你可以复制这个代码块然后调用它:
typedef void (^CallbackBlk)();
@property (copy) CallbackBlk cb;
- (void)doSomething:(CallbackBlk)blk
{
self.cb = blk;
// etc.
}
// when finished:
self.cb();
由于您在回调函数中没有使用任何参数,因此可以使用标准的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
}];