Objective c 嵌套的nsurl dataTaskWithRequest,但在调用完成处理程序之后
我有这部分代码,它是与“NSURLConnection sendSynchronousRequest”一起工作的,他们有一个分派,其中包含两个API调用,没有任何问题,但是,由于我正在转到“NSURLSession”,我想在completionHandler中的第一个响应之后调用下一个API,我需要为第二个API调用添加任何类型的调度吗Objective c 嵌套的nsurl dataTaskWithRequest,但在调用完成处理程序之后,objective-c,api,thread-safety,nsurlconnection,nsurlsession,Objective C,Api,Thread Safety,Nsurlconnection,Nsurlsession,我有这部分代码,它是与“NSURLConnection sendSynchronousRequest”一起工作的,他们有一个分派,其中包含两个API调用,没有任何问题,但是,由于我正在转到“NSURLSession”,我想在completionHandler中的第一个响应之后调用下一个API,我需要为第二个API调用添加任何类型的调度吗 // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch was here
__block NSString* url = @"www.google.com";
[[LoaderService get] getRequestFrom:url completionHandler:^(TcHttpJSONResponse *response) { // first Call
if (!response.success) {
dispatch_async(dispatch_get_main_queue(), ^{
failBlock();
});
return;
}
url = [NSString stringWithFormat:@"www.google.com/drive"];
[[LoaderService get] getRequestFrom:url completionHandler:^(TcHttpJSONResponse *response) { // second Call
if (!response.success) {
dispatch_async(dispatch_get_main_queue(), ^{
failBlock();
});
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
successBlock(transactionsArray);
});
}];
}];
// }]; //end of dispatch
装载机服务中
- (void)getRequestFrom:(NSString *)url completionHandler:(void (^)(TcHttpJSONResponse *response))completionHandler {
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:[TcHttpHelper getRequestFromUrlWithAuthorizationToken:url token:[self getAuthToken]]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
completionHandler([[TcHttpJSONResponse alloc] initWithResponse:data urlResponse:(NSHTTPURLResponse*)response error:error]);
}] resume];
}
我没有检查您的所有代码,但原则上您尝试执行的操作应该没有问题。@skaak是的,它可以工作,但这是正确的吗?我是否需要在第二次、第三次等http调用之前添加“dispatch\u async”,因为它位于上一次调用的completionHandler中?嗨-不,您可以在任何时间和任何线程上发送消息
NSURLSession.currentSession dataTask…
和NSURLSession.currentSession downloadTask…
是用于简单异步下载的两种goto解决方案。您可以从任何地方向他们发送消息,因为他们所做的只是安排一个新任务,然后在另一个线程上执行,并在完成时向您发送消息。如果要在完成时更新UI,您应该担心在完成处理程序的主线程上进行调度。因为嵌套调用将有许多调度器用于更新UI,这将不是一个好方法从代码上看,我在创建会话时使用delegateQueue解决了这个问题,所以现在整个完成处理程序都在主线程上。非常感谢您的帮助@skaakI没有检查您的所有代码,但原则上您尝试执行的操作应该没有问题。@skaak是的,它可以工作,但这是正确的吗?我是否需要在第二次、第三次等http调用之前添加“dispatch\u async”,因为它位于上一次调用的completionHandler中?嗨-不,您可以在任何时间和任何线程上发送消息NSURLSession.currentSession dataTask…
和NSURLSession.currentSession downloadTask…
是用于简单异步下载的两种goto解决方案。您可以从任何地方向他们发送消息,因为他们所做的只是安排一个新任务,然后在另一个线程上执行,并在完成时向您发送消息。如果要在完成时更新UI,您应该担心在完成处理程序的主线程上进行调度。因为嵌套调用将有许多调度器用于更新UI,这将不是一个好方法从代码上看,我在创建会话时使用delegateQueue解决了这个问题,所以现在整个完成处理程序都在主线程上。非常感谢@skaak的帮助