我有一个UITableView和一个Refresh按钮,以便从服务器获取新数据(如果有的话)。
[self startUpdates]; // animations
[[User myUser] getDataFromServer]; //async
[[User myUser] refreshElements:[[[UpdateContext alloc] initWithContext:data_ with:self with:@selector(endUpdates)] autorelease]];
[self.tableView reloadData];
上面的代码不能正常工作,因为 getDataFromServer 是一个异步方法,在服务器返回新数据(响应)时完成。我希望100%确定仅当 getDataFromServer 获得响应时才会执行 refreshElements 。
问题是:这样做的正确方法是什么。当且仅当第2行从服务器获得响应时,我希望第3行被执行。有什么想法吗?
答案 0 :(得分:3)
最简单的方法是更改getDataFromServer方法以接受一个块,该块将包含数据来自服务器后需要执行的代码。您应该确保该块将在主线程中执行。 这是一个例子:
更改方法:
- (void)getDataFromServer:(void (^)(NSError * connectionError, NSDictionary *returnData))completionHandler{
//perform server request
//...
//
NSDictionary * data; //the data from the server
NSError * connectionError; //possible error
completionHandler(connectionError, data);
}
如何使用块调用新方法:
[self getDataFromServer:^(NSError *connectionError, NSDictionary *returnData) {
if (connectionError) {
//there was an Error
}else{
//execute on main thread
dispatch_async(dispatch_get_main_queue(), ^{
[[User myUser] refreshElements:[[[UpdateContext alloc] initWithContext:data_ with:self with:@selector(endUpdates)] autorelease]];
[self.tableView reloadData];
});
}
}];