【问题标题】:wait for other thread to finish in objective c等待其他线程在目标 c 中完成
【发布时间】:2011-02-05 11:33:36
【问题描述】:

我正在使用 MGTwitterEngine 从 twitter 获取推文。这使用异步范例在另一个线程中获取该推文。它将获取的结果返回给主线程。

因为在获取推文后我还有一些处理待办事项,所以我想引入另一个线程来防止锁定 UI 线程。 我想这样做: UI 线程启动一个新线程 X。线程 X 使用 MGTEngine 开始异步获取推文,并等待完成。当 MGTwitterEngine 返回时,线程 X 处理推文,并通知 UI 线程我们准备好了。

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

【问题讨论】:

    标签: objective-c multithreading mgtwitterengine


    【解决方案1】:

    现在几乎没有什么理由不使用带有块的多线程。它们比 NSOperations 开发得更快,同步更简单,跳转线程(例如抓取 UI 线程)更简单,并且根据我自己的经验,它的性能更好。

    在这种情况下,我会创建一个块,生成一个新线程来启动您的异步提取(可能为每个线程生成一个异步提取 - 使取消更容易)将 2 个同步块放入队列中,这些块将在提取后触发为处理和 UI 更新完成。 这是一个很好的 tut: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);
    

    【讨论】:

    • 感谢您的回复。看起来不错,但 MGTwitterEngine 不使用异步获取的块。我打电话给 [twitterEngine getHomeTimelineSinceID: etc..];它以 mu 委托返回结果。它在那里创建了一个新线程。请参阅github.com/mattgemmell/MGTwitterEngine/blob/master/… 所以,我认为我的初始 fetch 将被触发,并且该块将立即继续 [processTweets]
    【解决方案2】:

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

    1. 使用阻塞网络调用 --- 如果可能的话。

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

    【讨论】:

      猜你喜欢
      • 2020-09-21
      • 2023-03-07
      • 1970-01-01
      • 2010-12-26
      • 2013-08-10
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多