【发布时间】:2015-04-12 17:59:05
【问题描述】:
我有一个带块的异步函数:
[self performAsyncTaskCompletion:(void(^) () )
{
//Do Something
}
];
我需要以同步方式多次调用此函数。我尝试使用 GCD 队列:
dispatch_queue_t queue = dispatch_queue_create("com.MyApp.task", NULL);
for (int i = 0; i < array.count; i++)
{
dispatch_sync(queue, ^{
[self performAsyncTaskCompletion:(void(^) () )
{
//Do Something
}
];
});
}
但它不起作用,因为 dispatch_sync 只是在等待块的结束。 我如何要求它等待其块中的异步函数结束?
【问题讨论】:
-
这些
performAsyncTaskCompletion块可以相互同时运行吗?或者你需要一个等待前一个完成。另外,我知道您要求在块的末尾等待,但这总是错误的模式。通常我们让它异步运行,但只指定一个代码块,当所有其他调度的块完成时将运行。这对你有用吗? -
是的,这就是我想做的。实际上,我想从网络服务器(异步)下载一堆不同的 JSON 文件。想象一下,每个 JSON 都会引导我到另一个 JSON 下载。可能我已经下载了下一个 JSON,所以我只需要执行一个同步任务来从一个数组中获取它。因此,JSON 下载应该是同步的。最后我需要一个块说“好的,一切都已下载”。我应该使用什么样的模式?
-
您说“想象一下每个 JSON 都将我引向另一个”。你是说每一个都真正依赖于前一个吗?通常,人们希望最大限度地提高并发性,但如果每个 JSON 都需要来自前一个 JSON 的数据,那就会限制你。
-
是的,我需要前一个来获取更多信息。我必须下载 2 JSON : B & C;但他们都将我引向另一个 JSON A 以获取更多信息。
-
是的,无论逻辑依赖是什么,尊重它们,但在可能的范围内,尽可能同时运行。如果你真的只有三个请求,它可能只有适度的影响,但你发出的请求越多,影响就越大。
标签: ios objective-c asynchronous block grand-central-dispatch