在NSoperationQueue启动之前重新加载UITableView

时间:2012-02-09 07:44:14

标签: iphone uitableview nsoperationqueue

我正在使用NSOperationQueue来调用viewWillAppear中的后台服务(我也尝试将其放在viewDidLoad中)。我根据我从服务中得到的结果填充UITableView。当我调试应用程序时,首先调用表,然后调用 operationQueue 。这样表格对我来说是空的。如何在 operationQueue 完成其工作后填充表格。

以下是代码:

viewWillAppear

-(void)viewWillAppear:(BOOL)animated
{
    operationQueue=[[NSOperationQueue alloc] init];
    ParseOperation *obj=[[ParseOperation alloc] initWithMembers:ID];
    [operationQueue addOperation:obj];
    [obj release];

}  

3 个答案:

答案 0 :(得分:1)

你必须为你的NSOperation设置一个完成集团。您必须在表视图上调用重新加载数据。

- (void)setCompletionBlock:(void (^)(void))block

编辑:

添加此

[obj setCompletionBlock:^{
                                NSLog(@"I have fnish");
                                 [self.tableView reloadData];
                                } 
     ]; 

答案 1 :(得分:1)

您可以将“reloadTable”添加为依赖于解析操作的特定操作,紧接在解析操作定义之后和启动队列之前(因此为安全起见,将队列初始化为暂停,然后仅在所有操作时启动它)已被添加):


// ... inside your operation code definition
NSInvocationOperation *reloadOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myReload) object:nil];
[reloadOp addDependency:obj] // adding here the parse operation as a dependency
[operationQueue addOperation:reloadOp];

需要将“myReload”操作定义为独立方法,以确保在主线程中调用reloadTable方法:

-(void)myReload { [table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; }

这样,只有在解析操作终止后才会运行重载代码。如果要运行更多操作并且需要在表重新加载之前执行所有操作,这将非常有用。请注意,依赖性不知道操作正常终止或已被取消。

您可以考虑的另一个好方法是定义GCD串行队列并按顺序添加两个块(第一个块是解析,第二个块是表重新加载)。在这种情况下,GCD将保证两个块(FIFO)的正确执行顺序。

答案 2 :(得分:0)

[tableView reloadData]完成后致电operationQueue