不调用NSURLSessionDataTask委托方法

时间:2016-01-09 19:44:17

标签: ios objective-c nsurlsession

我正在尝试从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”但仍然不打印字典...

3 个答案:

答案 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];