我正在使用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];
}
答案 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
。