GCD:UIViews上的两个平行动画

时间:2014-05-17 18:50:36

标签: ios multithreading

我来自这篇文章,因为讨论偏离了主要问题。 Behavior of GCD async method not understandable

请帮忙,

我的iPad应用程序有两个并排的TableViews。 这两个必须从两个不同的Web服务实时加载数据。 我想有两个线程 - 每个线程专用于一个tableview。 由于dispatch_get_main_queue只给我一个序列号,我将无法真正实时更新表。而且,它还涉及更新UI元素,我只需要在主队列上执行线程,这是串行的 - 使得并行获取不可能。

有人可以添加您的想法,让我如何让两个独立的线程同时运行并更新UI元素?

2 个答案:

答案 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更新发生在主队列中。