当dispatch_async任务完成时,我该如何收到通知?

11

我有一个异步任务,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{
     myAsyncMethodsHere;
});

有没有一种方法可以在后台任务完成时得到通知?

或者在完成后调用一个方法?

我已经阅读了文档并研究了dispatch_after,但似乎它更多地是设计用来在一定时间后调度方法。

感谢帮助。

1个回答

15

从文档中得知:

完成回调可以通过嵌套调用dispatch_async()函数实现。重要的是要在第一次调用dispatch_async()之前保留目标队列,并在完成回调结束时释放该队列,以确保目标队列在完成回调等待期间不会被释放。例如:

 void
 async_read(object_t obj,
         void *where, size_t bytes,
         dispatch_queue_t destination_queue,
         void (^reply_block)(ssize_t r, int err))
 {
         // There are better ways of doing async I/O.
         // This is just an example of nested blocks.

         dispatch_retain(destination_queue);

         dispatch_async(obj->queue, ^{
                 ssize_t r = read(obj->fd, where, bytes);
                 int err = errno;

                 dispatch_async(destination_queue, ^{
                         reply_block(r, err);
                 });
                 dispatch_release(destination_queue);
         });
 }

来源


嗨..我有一个疑问..根据文档: dispatch_async 立即返回,然后块在后台异步执行。我的疑问是..既然我们在调用内部的 dispatch_async 后使用了 dispatch_release,那么它不会在执行其中的块之前释放 destination_queue 吗? - Devarshi
可能最好将释放操作包含在dispatch_async回调中,像这样:dispatch_async(destination_queue, ^{ reply_block(r, err); dispatch_release(destination_queue); }); - ACBurk
我相信队列将会在创建块时保留,而不是在执行时。 - Ben Scheirman
块实例是在执行到声明它的那一行时创建的。当这种情况发生时,队列被保留。随后的 dispatch_release 只会释放您对其的句柄。块将始终拥有一个句柄。一旦块消失,队列也将消失。 - Ben Scheirman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接