我正在尝试从API下载一些JSON。现在什么都没有印出来。
我确信路径和API键/值可以工作,因为我使用完成处理程序对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。所以,现在我打印“这里2”,但仍然没有打印字典。
发布于 2016-01-09 19:50:52
使用该方法
+ (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);
}发布于 2018-08-01 20:39:52
面对一个类似的问题,当我终于得到答案的时候,我被困了很长时间。希望它对那些寻找类似问题的人有帮助。
斯威夫特
//创建一个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)
}`发布于 2017-07-19 10:43:07
您必须首先在viewDidload中设置委托。
id <NSURLSessionDelegate> delegate = [[Your_ViewController alloc]init];https://stackoverflow.com/questions/34698102
复制相似问题