繁体   English   中英

在NSoperationQueue启动之前重新加载UITableView

[英]UITableView reloaded before NSoperationQueue starts

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

这是代码:

viewWillAppear

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

}  

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

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

编辑:

加上这个

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

您可以在解析操作定义之后和启动队列之前立即将“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)的正确执行顺序。

operationQueue完成后调用[tableView reloadData]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM