我来自这篇文章,因为讨论偏离了主要问题。 Behavior of GCD async method not understandable
请帮忙,
我的iPad应用程序有两个并排的TableViews。 这两个必须从两个不同的Web服务实时加载数据。 我想有两个线程 - 每个线程专用于一个tableview。 由于dispatch_get_main_queue只给我一个序列号,我将无法真正实时更新表。而且,它还涉及更新UI元素,我只需要在主队列上执行线程,这是串行的 - 使得并行获取不可能。
有人可以添加您的想法,让我如何让两个独立的线程同时运行并更新UI元素?
答案 0 :(得分:0)
是的,您只能更新主线程上的UI。
如果使用UIView animateWithDuration:... animations:...
,您可以在动画块中的多个不同视图上放置多个动画,以便它们同时运行。您也可以反复拨打animateWithDuration:animations:
。
对于图层,您可以使用CAAnimationGroup
对动画进行分组以便并发执行。
在任何情况下,您都不应该使用(或尝试使用)GCD进行UI动画。
答案 1 :(得分:0)
你问:
有人可以添加您的想法,让我如何让两个独立的线程同时运行并更新UI元素?
您可以简单地让这些线程在后台线程中执行请求和解析,然后让它们将模型和UI更新分派回主队列。
例如,您可以执行以下操作:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// issue first web service request
// when done, update the UI
dispatch_async(dispatch_get_main_queue(), ^{
// update the model here
// also issue the `reloadData` (or whatever table updates you want)
// for the first table view
});
});
和
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// issue second web service request
// when done, update the UI
dispatch_async(dispatch_get_main_queue(), ^{
// update the model here
// also issue the `reloadData` (or whatever table updates you want)
// for the second table view
});
});
这两个将同时运行(因为所有全局队列都是并发队列),但UI /模型更新将被分派到主队列,这将确保一切保持同步,UI更新成功发生等等。因此,您喜欢后台队列提供的并发性,但您可以在需要的地方利用串行主队列。
显然,上述假设您将网络请求分派到某个后台队列(我们将使用默认的全局队列),但发出异步网络请求的确切机制可能会有很大差异(以及可能根本不涉及任何调度)。如果您需要具体的咨询,您应该准确分享您向Web服务发出请求的方式(例如AFNetworking?NSURLConnection
(以及NSURLConnection
,其中一种便捷方法或基于代理的方法)?NSURLSession
?),因为实施细节会根据您提出请求的方式而有所不同。
但这个想法很简单:异步执行网络服务请求,然后确保在请求完成后,在主队列上执行生成的模型和UI更新。这样,您就享受了请求的并发性,但UI更新发生在主队列中。