2013-01-14 16 views
0

我试图获取JSON数据并将其解码,同时取消隐藏显示UIActivityIndicatorUILabel(@“搜索... “),所以用户知道该应用程序正在搜索。iOS - 多线程 - 显示视图与搜索...并同时执行代码

下面是它如何工作:

  1. 用户点击“搜索按钮”
  2. IBAction方法取消隐藏查找视图,并获取和数据同时解码(我可以单独做这些,不在一起)。
  3. 搜索完成后,使用[self performSegueWithIdentifier:]将新视图推入堆栈。

我试过使用dispatch_queue,但这样做不会让我使用push到堆栈上的新视图,而完全绕过其他代码(至少是我这样做的方式)。我被告知要使用NSConnection,但我已经看过API,并且对于如何使用它来完成此操作一无所知。

dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL); 

dispatch_async(myQueue, 
^{ 
    //...URL Request, parse JSON, etc. 

    dispatch_async(dispatch_get_main_queue(), 
    ^{ 
     searchingView.hidden = NO; 
     [spinner startAnimating]; 

     }); 
}); 

[self performSegueWithIdentifier:@"aSegue"]; 

这种方式跳过所有的代码,并立即执行segue。 如果我把它放在dispatch_queue里面的代码的其余部分,它执行代码,但不执行segue。最后,使用这种方法,它首先执行搜索,然后显示视图。我需要相反的。

任何帮助,非常感谢!

+0

“我试过使用dispatch_queue,但这样做不会让我使用将新视图推入堆栈而不绕过其他代码(至少是我这样做的方式)。”你能更好地解释这部分吗?我没有看到问题,但你似乎看到一个问题。 –

+0

@FábioOliveira添加上面的代码作为示例,并随后解释问题。 – jpcguy89

+0

我认为thelaws已经发布了一个正确的答案。您更新UI以通知搜索正在进行,获取JSON并在后台处理它,并在完成后更新主线程中的UI。 –

回答

2

我将在分派工作之前显示搜索视图,并且在JSON被读取和解析之后使用分派到主队列执行segue。

searchingView.hidden = NO; 
[spinner startAnimating]; 

dispatch_async(myQueue, ^{ 
    //...URL Request, parse JSON, etc. 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"aSegue"]; 
    }); 
});