Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 嵌套的nsurl dataTaskWithRequest,但在调用完成处理程序之后_Objective C_Api_Thread Safety_Nsurlconnection_Nsurlsession - Fatal编程技术网

Objective c 嵌套的nsurl dataTaskWithRequest,但在调用完成处理程序之后

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,

我有这部分代码,它是与“NSURLConnection sendSynchronousRequest”一起工作的,他们有一个分派,其中包含两个API调用,没有任何问题,但是,由于我正在转到“NSURLSession”,我想在completionHandler中的第一个响应之后调用下一个API,我需要为第二个API调用添加任何类型的调度吗

//    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的帮助