问题 如何在dispatch_async任务完成时收到通知?


我有一个像这样的异步任务:

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

有没有办法在后台任务完成时得到通知?

或者在完成后调用方法?

我已经阅读了文档并查看了dispatch_after,但似乎更多的设计是在一段时间后调度该方法。

谢谢您的帮助。


9062
2017-07-31 16:56


起源



答案:


来自文档:

完成的回电

完成回调可以通过对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);
         });
 }

资源


15
2017-07-31 17:02



嗨..我有一个疑问..根据文档: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
@ACBurk ...感谢您的澄清:-) - Devarshi
@BenScheirman ......你能详细阐述一下你的观点吗? - Devarshi


答案:


来自文档:

完成的回电

完成回调可以通过对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);
         });
 }

资源


15
2017-07-31 17:02



嗨..我有一个疑问..根据文档: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
@ACBurk ...感谢您的澄清:-) - Devarshi
@BenScheirman ......你能详细阐述一下你的观点吗? - Devarshi