我正在尝试从API下载一些JSON。现在没有任何东西被打印出来。
我确定路径和API Key / Value是可行的,因为我使用完成处理程序的NSURLSessionDataTask来完成它,但我想了解如何使用委托方法执行相同操作。
但我似乎无法弄清楚为什么我的委托方法没有被调用。
@interface MetaData () <NSURLSessionDelegate, NSURLSessionDataDelegate>
@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。所以现在我打印“here 2”但仍然不打印字典...
答案 0 :(得分:5)
使用方法
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
delegate:(id<NSURLSessionDelegate>)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);
}
答案 1 :(得分:0)
遇到了类似的问题,当我终于得到答案时,被困了很长时间。希望它对搜索类似问题的人有帮助
迅速
//创建一个URLSessionConfiguration对象
`let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
mySession = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)`
//发出请求
`let myTask = mySession.dataTask(with: request as URLRequest , completionHandler: { (data: Data?, response: URLResponse?, error:Error?) in
if let error = error {
print(error.localizedDescription)
}
else{
print(response)
}
})
myTask.resume()`
//如果需要重定向,请实现委托方法
`func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
var newRequest = URLRequest(url:(request.url?.absoluteURL)!)`
///从委托方法中获取URL请求,然后开始执行新任务
`let newDataTask = nestSession.dataTask(with: newRequest)
newDataTask.resume()
}`
//实现委托方法以捕获数据
`func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
NSLog("task data: %@", data as NSData)
}`
答案 2 :(得分:-1)
您必须先在 viewDidload
中设置委托id <NSURLSessionDelegate> delegate = [[Your_ViewController alloc]init];