У меня возникла проблема при попытке получить данные с помощью методов делегата 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];
}
однако его следует вызывать до didCompleteWithError, не так ли? Я предполагаю, что другие методы, отвечающие за добавление данных, не могут быть вызваны, и тогда данные равны нулю.
Я уверен, что могу получить данные на стороне сервера, поскольку, когда я использую блочный метод (а не методы делегата), 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
}
}];
Однако нельзя было вызвать делегата с блоком.
Любая идея, как «данные» исчезают? Или я должен что-то изменить, когда не использую блок?
Спасибо за помощь!
dataTaskWithURL
. - person Rob   schedule 16.11.2016