确保为iOS完成异步任务

时间:2015-01-13 10:48:26

标签: ios objective-c uitableview ios8

我有一个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行被执行。有什么想法吗?

1 个答案:

答案 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];
        });
    }
}];