GCD:UIViews上的两个并行animation

我是从这个职位来的,因为讨论太偏离了主要问题。 GCDasynchronous方法的行为不可理解

请帮忙,

我的iPad应用程序有两个并排的TableViews。 这两个不得不从两个不同的Web服务实时加载数据。 我想有两个线程 – 每个专用于一个tableview。 由于dispatch_get_main_queue只能给我一个序列号,所以我不能实时更新表。 而且,它也涉及到更新UI元素,我只需要在主队列上进行线程化,这是串行化 – 并行获取是不可能的。

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

你问:

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

你可以简单地让这些线程在后台线程中做他们的请求和parsing,然后让他们将模型和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更新成功发生,等等。因此,您享受的并发提供后台队列,但是您将利用您需要的串行主队列。

显然,上面假设你正在调度networking请求到一些后台队列(我们将使用默认的全局队列),但是发出asynchronousnetworking请求的确切机制可能差别很大(并且可能根本不涉及任何调度)。 如果您需要特定的build议,您应该精确地分享如何向Web服务发布请求(例如AFNetworking? NSURLConnection (以及NSURLConnection ,其中一种便利方法或基于委托的方法)? NSURLSession ?),作为实现细节将根据您如何提出请求而有所不同。

但想法很简单:asynchronous执行networking服务请求,然后确保请求完成后,在主队列上执行结果模型和UI更新。 这样,您就可以享受请求的并发性,但UI更新发生在主队列中。

是的,你只能在主线程上更新UI。

如果您使用UIView animateWithDuration:... animations:...您可以将多个animation放置在animation块中的多个不同视图上,以便它们同时运行。 您也可以反复调用animateWithDuration:animations:

对于图层,可以使用CAAnimationGroup为并发执行分组animation。

无论如何,你不应该使用(或试图使用)用于UIanimation的GCD。