我目前正在尝试在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];
}
感谢您的答复。
最佳答案
在异步方法完成之后执行方法的方法是在异步方法的完成块(或闭包)中调用该方法。
对于您的情况,它看起来像这样:
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
if (!error) {
[self MethodB];
}
}]resume];
});
成功完成异步方法后要运行的调用将移到完成处理程序中。
根据需要,只有且仅当sendData完成时,这样才能完成MethodB的执行。
关于ios - 在NSURLSession之后同步执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34029701/