Objective c NSURLSession-数据为零

Objective c NSURLSession-数据为零,objective-c,delegates,nsdata,nsurlsession,nsurlsessionconfiguration,Objective C,Delegates,Nsdata,Nsurlsession,Nsurlsessionconfiguration,尝试使用NSURLSession委托方法获取数据时遇到问题。我发现了这个错误: "Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'" 我不明白的是 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask

尝试使用NSURLSession委托方法获取数据时遇到问题。我发现了这个错误:

"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'"
我不明白的是

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

    CGFloat percentDone = (double)totalBytesWritten/(double)totalBytesExpectedToWrite;
    NSLog(@"Pourcentage: %f", percentDone);
}
返回1.000000,并调用以下委托方法

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    // Parse the JSON that came in

    NSLog(@"DidComplete"); --> I can see this message

    if (error) {
        NSLog(@"Error in finishLoading: %@", error.localizedDescription); --> but this message is not displayed. There is no error, only data returning nil resulting in a crash...
    }
    else {
    ....
}
但以下方法不被调用

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *) response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {

    NSLog(@"DidReceiveResponse"); --> not displayed

    completionHandler(NSURLSessionResponseAllow);
}


- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {

    NSLog(@"DidReceiveData. Data: %@", data); --> not displayed

    _downloadedData = [[NSMutableData alloc] init];
    [_downloadedData appendData:data];
}
然而,它应该在完成之前被调用,不是吗?我假设处理附加数据的其他方法无法调用,然后数据为nil

我确信我可以在服务器端获取数据,因为当我使用block方法(而不是delegate方法)时,NSData对应于我要查找的内容

奇怪的是,在我像这样更改配置会话之后出现了此错误:

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession2 = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

    NSURL *url = [NSURL URLWithString:@"http://localhost:8888/download_list.php"];

    NSURLSessionDownloadTask *dataTask = [defaultSession2 downloadTaskWithURL:url];
在这种情况下,我可以看到从服务器检索到的NSData

NSURLSessionDataTask *dataTask = [defaultSession2 dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if(error == nil) {
         NSString * text = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];
         NSLog(@"Data = %@",text); -> text corresponds to the data I am looking for
    }
}];
但是,无法使用块调用委托

知道“数据”是如何消失的吗?或者我应该在不使用积木时改变一些东西吗


谢谢你的帮助

如果使用URL调用
数据任务,则不会调用
didReceiveResponse
didReceiveData
委托方法,如下所示:

NSURLSessionDataTask *dataTask = [defaultSession2 dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    ...
}];
您正在提供一个完成处理程序,请求它为您捕获
响应
数据
。因此,要做到这一点,它不会调用委托方法

如果希望调用委托方法,只需执行以下操作:

NSURLSessionDataTask *dataTask = [defaultSession2 dataTaskWithURL:url];
坦率地说,尽管如此,您目前在这些方法中没有做任何重要的事情,所以我想知道您为什么要使用委托方法而不是完成处理程序。完成处理程序模式更简单


顺便说一下,如果要使用这些方法,请确保
didReceiveData
只附加了附加项。在
didReceiveResponse
中实例化可变数据对象。可能需要一个以上的
didReceiveData
调用才能接收整个响应,原始代码示例将截断结果。你大概想做一些类似的事情:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *) response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
    NSLog(@"DidReceiveResponse");                 // will now be displayed

    _downloadedData = [[NSMutableData alloc] init];

    completionHandler(NSURLSessionResponseAllow);
}


- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
    NSLog(@"DidReceiveData. Data: %@", data);     // will now be displayed

    [_downloadedData appendData:data];
}

没关系,我很愚蠢,这是一个NSURLSessionDownloadTask而不是一个NSURLSessionDataTask。。。然而我有一个奇怪的消息:nw_主机_统计数据_添加_src recv太小,收到24个,预计28个。有人知道它是什么意思吗?不幸的是,它没有改变任何东西……奇怪的信息是一个新问题。删除Q并创建一个新的Q。抓住真正的问题不是读者的任务。我还没有真正理解新队列的目标是什么?我更改了dataTask,并调用了委托方法,thx。不是“队列”,而是“问题”。他说,如果你对一些奇怪的日志消息有疑问,那是完全不同的问题,应该作为一个单独的问题发布,而不是在这个问题下面的评论中提问。这里的问题似乎是“为什么我没有看到我的委托方法被调用?”,答案是“因为您使用了
dataTaskWithURL
的完成处理程序格式副本”