首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不调用NSURLSessionDataTask委托方法

不调用NSURLSessionDataTask委托方法
EN

Stack Overflow用户
提问于 2016-01-09 19:44:17
回答 3查看 5.8K关注 0票数 0

我正在尝试从API下载一些JSON。现在什么都没有印出来。

我确信路径和API键/值可以工作,因为我使用完成处理程序对NSURLSessionDataTask进行了操作,但我想了解如何使用委托方法进行相同的操作。

但我似乎不明白为什么不调用我的委托方法。

代码语言:javascript
复制
@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);
}

谢谢你的帮助。

编辑

代码语言:javascript
复制
defaultSesh = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];

通过添加该行,我将委托设置为self。所以,现在我打印“这里2”,但仍然没有打印字典。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-09 19:50:52

使用该方法

代码语言:javascript
复制
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
                                  delegate:(id<NSURLSessionDelegate>)delegate
                             delegateQueue:(NSOperationQueue *)queue

若要正确设置委托,请执行以下操作。

更新:

您必须调用didReceiveResponse的完成处理程序。

completionHandler 代码调用以继续传输的完成处理程序,传递一个常量以指示传输是作为数据任务继续进行,还是应该成为下载任务。 ·如果通过NSURLSessionResponseAllow,任务将继续正常进行。 ·如果通过NSURLSessionResponseCancel,任务将被取消。 ·如果传递NSURLSessionResponseBecomeDownload作为配置,则调用委托的URLSession:dataTask:didBecomeDownloadTask:方法,为您提供取代当前任务的新下载任务。

例如

代码语言:javascript
复制
- (void) URLSession:(NSURLSession *)session 
           dataTask:(NSURLSessionDataTask *)dataTask 
 didReceiveResponse:(NSURLResponse *)response 
  completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    completionHandler(NSURLSessionResponseAllow);
}
票数 5
EN

Stack Overflow用户

发布于 2018-08-01 20:39:52

面对一个类似的问题,当我终于得到答案的时候,我被困了很长时间。希望它对那些寻找类似问题的人有帮助。

斯威夫特

//创建一个URLSessionConfiguration对象

代码语言:javascript
复制
`let config = URLSessionConfiguration.default
 config.requestCachePolicy = .reloadIgnoringLocalCacheData
 mySession = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)`

//提出请求

代码语言:javascript
复制
`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()`

//如果存在重定向所需的实现委托方法

代码语言:javascript
复制
`func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {

var newRequest =URLRequest(url:(request.url?.absoluteURL)!)

//接受委托方法中的URL请求,然后开始一个新任务

代码语言:javascript
复制
 `let newDataTask = nestSession.dataTask(with: newRequest)
  newDataTask.resume()

}`

//实现用于捕获数据的委托方法

代码语言:javascript
复制
`func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    NSLog("task data: %@", data as NSData)
}`
票数 0
EN

Stack Overflow用户

发布于 2017-07-19 10:43:07

您必须首先在viewDidload中设置委托。

代码语言:javascript
复制
id <NSURLSessionDelegate> delegate = [[Your_ViewController alloc]init];
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34698102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档