我试图从API下载一些JSON.现在什么都没打印出来.
我肯定知道路径和API Key/Value是有效的,因为我使用NSURLSessionDataTask和完成处理程序来完成它,但我想学习如何使用委托方法做同样的事情.
但我似乎无法弄清楚为什么我的委托方法没有被调用.
@interface MetaData ()@end @implementation MetaData -(void)downloadData { NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; [sessionConfig setHTTPAdditionalHeaders:@{ header : key}]; NSURLSession *defaultSesh = [NSURLSession sessionWithConfiguration:sessionConfig]; NSURLSessionDataTask *dataTask = [defaultSesh dataTaskWithURL:[NSURL URLWithString:path]]; defaultSesh = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; [dataTask resume]; } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { NSLog(@"here 2"); } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { NSLog(@"here"); _weaponDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; NSLog(@"dictionary: %@", _weaponDictionary); }
谢谢您的帮助.
编辑
defaultSesh = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
通过添加该行,我将委托设置为self.所以现在我打印"这里2"但仍然不打印字典...
使用该方法
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id)delegate delegateQueue:(NSOperationQueue *)queue
正确设置委托.
更新:
你必须调用完成处理程序 didReceiveResponse
completionHandler
代码调用的完成处理程序,用于继续传输,传递常量以指示传输是继续作为数据任务还是应该成为下载任务.
•如果通过NSURLSessionResponseAllow
,任务将继续正常进行.
•如果通过NSURLSessionResponseCancel
,则任务将被取消.
•如果NSURLSessionResponseBecomeDownload
作为处置传递,URLSession:dataTask:didBecomeDownloadTask:
则调用委托的方法为您提供取代当前任务的新下载任务.
例如
- (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { completionHandler(NSURLSessionResponseAllow); }