gpt4 book ai didi

ios - NSURLSession 委托(delegate)方法未被调用

转载 作者:行者123 更新时间:2023-11-28 19:31:38 25 4
gpt4 key购买 nike

我正在尝试更新旧应用程序以从 NSURLConnection 移动到 NSURLSession。当我为 NSURLSession 使用 block 时一切正常:

 NSURLSessionDataTask *dataTask = [session
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {}

但有时我需要分析应用程序从服务器接收的数据,所以我需要 didReceiveResponse 和 didReceiveData 方法,类似于与 NSURLConnection 一起使用的方法。我正在尝试这样做:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
delegate:self
delegateQueue:nil];
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"]];
[dataTask resume];

但我的委托(delegate)人从未被调用过:

- (void)URLSession:(NSURLSession *)session
NSURLSessionTaskDelegatedidReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
NSLog(@"-----------------------> NSURLSessionTaskDelegatedidReceiveResponse");
completionHandler(NSURLSessionResponseAllow);
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"----------------> didReceiveData");
}

当我尝试使用其他类型的任务(例如 NSURLSessionDownloadTask)时,也会发生同样的事情,它们的委托(delegate)永远不会被调用。我实际上可以在调试器中看到任务正在切换到运行状态,但我永远无法调用任何委托(delegate)。在我的头文件中,我确实使我的 ViewController 符合委托(delegate):

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate>

我进行了相当多的搜索,但即使我尝试从网络上获取一些有效示例,只要我尝试将它们粘贴到我的项目中,它们就会停止工作。例如this tutorial非常适合我(我必须向 plist 文件添加传输安全权限,仅此而已)。但是当我尝试在我的项目中使用此代码时,永远不会调用委托(delegate)。当我实际将我的代码粘贴到另一个简单的应用程序时,它工作得很好。那么我的项目设置可能有问题吗?你能告诉我什么会导致这样的事情吗?我现在完全不知所措。

最佳答案

您正在使用完成 block 。这不包括委托(delegate)调用。 https://developer.apple.com/reference/foundation/nsurlsessiondatadelegate?language=objc

Completion handler block are primarily intended as an alternative to using a custom delegate. If you create a task using a method that takes a completion handler block, the delegate methods for response and data delivery are not called.

并且您要使用的方法具有不同的名称

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler

关于ios - NSURLSession 委托(delegate)方法未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43636181/

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