我目前正在尝试在NSURLSession完成后执行一个方法。问题是我无法以任何方式管理其对象的异步性质。我按照其他问题的建议尝试了GCD和NSOperation,但没有任何变化:在使用 dataTaskWithRequest:completionHandeler:进行初始化之后,应用程序开始执行程序中的下一个方法。
以下是实现网络的方法:
-(void)sendData{
NSData *JSONdata = [NSJSONSerialization dataWithJSONObject:userInfoToJSON options:0 error:&error];
NSURL *url = [NSURL URLWithString:@"http://mobdev2015.com/register.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[JSONdata length]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:JSONdata];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}]resume];
});
}
以下是调用上面的方法以及我想要实现同步执行的方法:
-(void)MethodWhichNeedsToBeSync{
//Creating a JSON object..
[self sendData:userInfoToJSON];
//MethodB wants to be executed if and only if sendData is completed
[self MethodB];
}
感谢您的回复。
答案 0 :(得分:2)
在完成异步方法后执行方法的方法是在异步方法的完成块(或闭包)中调用该方法。 / p>
对于您的情况,它看起来像这样:
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
if (!error) {
[self MethodB];
}
}]resume];
});
将成功完成异步方法后运行的调用移入完成处理程序。
当且仅当sendData完成时,这将完成MethodB的执行。
答案 1 :(得分:0)
据我从NSURLSession文档中可以看出,没有办法使用它来发出同步请求。我认为这是因为你真的不应该拨打可以阻止主队列的电话 但是,如果不需要使用NSURLSession,则只需使用NSURLConnection即可。您可以使用您的请求初始化它并调用" sendSynchronousRequest:returningResponse:"。