如何在performSelectorInBackground之后更新UItableview?

时间:2011-10-15 07:09:06

标签: objective-c uitableview

我有一个UIView,里面有2个视图,一个是关于我们的页面,另一个是通过uisegmentation控制的twitter流/页面。

twitter feed在didFinishLaunchingWithOptions上运行,并在后台运行。

在Twitter页面本身,我有一个重新加载按钮,启动相同的过程,再次在后台执行。

我被困了,因为表视图永远不会更新,即使是

[self.tableView reloadData];

在performInSelector之后直接。

因此,我想要一次更新表的数据:

[self performSelectorInBackground:@selector(reloadTwitter :) withObject:nil];

结束了。

我该如何完成这项任务?

2 个答案:

答案 0 :(得分:4)

第一个答案可能会奏效,但您可能对使用GCD和阻止不感兴趣。总的来说,真正的问题很可能是您不应该尝试更新后台线程中的任何用户界面元素 - 您必须从主线程中执行此操作。

所以你最好的选择是在刷新twitter feed的方法中添加另一行:

[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:No];

Apple在此处提供了相关文档:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

检查标有“线程和用户界面”的部分。

答案 1 :(得分:2)

使用GCD和阻止......:)

/* get a background queue (To do your things that might take time) */
dispatch_queue_t backgroundQueue = 
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/* get the main queue (To update the UI)*/
dispatch_queue_t mainQueue = dispatch_get_main_queue();

/* use dispatch_async to run something (twitter, etc)
   asynchronously in the give queue (in the background) */
dispatch_async(backgroundQueue,^{
  [self reloadTwitter];
  /* use again dispatch_async to update the UI (the table view)
     in another queue (the main queue) */
  dispatch_async(mainQueue,^{
    [self.tableView reloadData];
 });
});