2011-02-05 34 views
0

我正在使用MGTwitterEngine从Twitter获取推文。这使用异步范式来获取另一个线程中的tweets。它将获取的结果返回给主线程。等待其他线程完成目标c

因为我在提取tweets后有一些处理待办事项,所以我想介绍另一个线程来防止锁定UI线程。 我喜欢这样做: UI线程启动一个新线程X.线程X启动与MGTEngine的异步获取推文,并且等待完成。当MGTwitterEngine返回时,线程X处理推文,并通知UI线程我们已准备好。

我的问题是:如何设置线程X等待MGTwitterEngine reade?

回答

0

现在有很少的借口不使用多线程块。它们比NSOperations更快,同步更简单,跳跃线程(例如抓取UI线程)更简单,以我自己的体验,它的性能更好。

在这种情况下,我会创建一个块,产生一个新的线程来启动异步获取(可能为每个线程产生一个异步获取 - 使取消更容易)在队列中放置2个同步块,提取完成处理和UI更新。 这里是一个很好啧啧:http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/

//GOES IN Tweet delegate 

myQueue = dispatch_queue_create("myQueue", 0);//local instance var dispatch_queue_t 

dispatch_async(myQueue, ^{ 

         [self processTweets];//executed after fetch is done. 
         dispatch_sync(dispatch_get_main_queue(), ^{ 
          [self uiBasedFunction];//executed on main thread 
                  }); 
         }); 
dispatch_release(myQueue); 
+0

感谢您的回复。它看起来没问题,但是MGTwitterEngine并不使用与异步读取相关的块。我致电[twitterEngine getHomeTimelineSinceID:etc ..];并在mu委托中返回结果。它在那里创建一个新线程。请参阅https://github.com/mattgemmell/MGTwitterEngine/blob/master/MGTwitterEngine.m 所以,我认为我的初始抓取将被解雇,并且该块将立即与[processTweets] – jwdehaan 2011-02-05 14:00:05

0

有2种方法可以做到这一点。

  1. 使用阻止网络调用---如果posible。

  2. 调用CFRunLoopRun()---等待另一个事件继续执行线程中的操作。一旦异步数据读取完成,就调用线程x中的X runloops上下文中的CFRunLoopStop()。