gpt4 book ai didi

ios - NSURLSessionTaskDelegate 是什么时候设置的?

转载 作者:行者123 更新时间:2023-11-28 21:17:16 31 4
gpt4 key购买 nike

我刚学会使用 NSURLSession API,我发现我们在创建 session 时只是设置了 NSURLSessionDelegate

self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

而且我们没有设置NSURLSessionTaskDelegate,但是NSURLSessionTaskDelegate方法也会被调用,好像系统会在对象上调用NSURLSessionTaskDelegate方法,符合NSURLSessionDelegate?

更新演示代码

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession* session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

NSURLSessionDataTask* task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];

[task resume];
}


- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}


- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{

}

最佳答案

如果我没理解错的话,你的意思是你创建了一个实现了 <NSURLSessionDelegate> 中的方法的类。和 <NSURLSessionTaskDelegate>协议(protocol),但你只声明它实现了 <NSURLSessionDelegate>协议(protocol)。然后,您在创建 session 时将其作为委托(delegate)传递,并且您对为什么还调用 session 任务委托(delegate)方法感到困惑。

首先,每个 session 只有一名代表。它处理与 session 相关的事件和与任务相关的事件。委托(delegate)方法被分组到多个协议(protocol)中,使它们更容易记录和理解。任务和 session 委托(delegate)方法之间的区别没有运行时意义。

NSURLSession类由 Apple 预编译。它不是使用您的 header 编译的,因此它不知道您传入的类对象的 header 是否具有 <NSURLSessionTaskDelegate>。装修与否。这些装饰只有在告诉编译器该类应该包含这些方法的上下文中才有意义。如果将该类的一个实例传递给一个方法,该方法的参数类型表明传入的对象必须符合 <NSURLSessionTaskDelegate>协议(protocol)而你的类没有,编译将失败。同样,如果您在协议(protocol)中缺少必需的方法,编译您的类将失败。然而,除了这两个目的之外,这些装饰基本上只是为了程序员的利益。

此外,因为所有 NSURLSession委托(delegate)方法是可选的, session 不能假定它的委托(delegate)将支持任何特定的方法,这取决于它声称无论如何要遵守的协议(protocol)。

由于这些原因,在运行时级别, session 通过询问委托(delegate)对象是否支持该方法来确定是否调用每个委托(delegate)方法。如果它说"is",则 session 将调用该方法。

因为您的类为任务和 session 委托(delegate)方法都提供了实现,所以当被问及它是否支持这些方法时,该类会自动回答"is",因此 NSURLSession在适当的时候给他们打电话。

关于ios - NSURLSessionTaskDelegate 是什么时候设置的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40970666/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com