2011-01-24 47 views
1

鉴于控制器的viewDidLoad()方法我打电话NSThread为UITableView的

[NSThread detachNewThreadSelector:@selector(readFromFaceBook) 
         toTarget:self 
         withObject:nil]; 

readFromFaceBook将拉动从远程位置的数据,并填充称为“myData的”在NSMutabaleArray的数据。视图控制器包含从myData加载数据的tableView

我现在的问题是,如何延迟tableView委托的执行,直到所有的数据都被线程加载到“myData”中。由于委托函数试图使用myData执行,程序崩溃。任何帮助是极大的赞赏...!!!!

回答

1

您应该创建tableview并立即显示,以便用户不认为您的应用程序不起作用。也许UIProgressIndicator或什么东西来表明你在做什么?

您的后台线程应该按照您正确选择的方式进行加载。完成后,通过performSelectorOnMainThread:...dispatch_async()dispatch_get_main_queue()回调主线程,并调用[myTableView reloadData]刷新UI。

为了防止过早加载tableview,可以采取几种方法。假设你将数据存储在一个数组中,因为UITableView显示有序的数据。如果是这样,那么在线程结束之前不要填​​充数组。如果这不起作用,您可以使用一个BOOL伊娃,用于指示您是否已完成加载,然后使用BOOL的状态来确定您应在UITableView中显示的内容。

+0

伟大的作品..谢谢伙计们的即时响应.... !!! – bp581 2011-01-24 04:35:38

1

两件事情可以做:要么实例化tableView你得到的数据或致电[tableView reloadData]你得到一个回调说你的数据加载完成后后。

+0

..after你会得到一个回调说你的数据加载完成。”可以告诉我的示例代码来完成这也是我怎么才能启动tableView后得到的数据... ?? – bp581 2011-01-24 04:01:58

0

你的辅助线程不应该处理UI工作。

一旦你得到回调下载完成,数据在“myData”集合---在主线程上下文中调用一个函数,假设你正在调用UpdateTable :.

使用下列API来做到这一点

[self performSelectorOnMainThread:@selectore(UpdateTable:) withObject:<#(id)arg#> waitUntilDone:<#(BOOL)wait#> 

IN的UpdateTable

- (void)UpdateTable:(id)inData 
{ 
    [<view object> reloadData]; 
}