gpt4 book ai didi

ios - 传递一个委托(delegate)作为 NSURLSession 的参数

转载 作者:行者123 更新时间:2023-11-29 01:14:01 25 4
gpt4 key购买 nike

我有一个名为 RestService 的类,我在我的整个应用程序中使用它来执行对 Web 服务的多个同步请求。我向此类添加了一个新方法来执行异步请求,我想再次在我的整个应用程序中重复使用该请求。这是该新方法的代码:

- (void)backgroundExecutionOfService:(NSString *)serviceName 
withParameters:(NSDictionary *)parameters
inView:(UIView *)view
withDelegate:(UIViewController *)delegate
{
NSString *serviceUrl = @"http://MyWebServer/public/api/clients/5";
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.allowsCellularAccess = YES;
sessionConfig.timeoutIntervalForRequest = 10;
sessionConfig.timeoutIntervalForResource = 10;
sessionConfig.HTTPMaximumConnectionsPerHost = 1;

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

NSURLSessionDownloadTask *getFileTask;
getFileTask = [session downloadTaskWithURL:[NSURL URLWithString:serviceUrl]];
[getFileTask resume];
}

但 XCode 警告我使用该参数作为委托(delegate)(将 UIViewController * __strong' 发送到不兼容类型 'id< NSURLSessionDelegate > _Nullable' 的参数)。我确保我作为参数发送的 View Controller 已在 .h 中声明了 < NSURLSessionDelegate >,并且我在 ViewController 的实现文件中创建了委托(delegate)方法。

- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error{
NSLog(@"Became invalid with error: %@", [error localizedDescription]);
}

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler{
NSLog(@"Received challenge");
}

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
NSLog(@"Did finish events for session: %@", session);
}

应用程序不会崩溃,但永远不会调用委托(delegate)方法。同步 Web 服务按预期工作。

最佳答案

发生这种情况是因为 UIViewController 类不符合 NSURLSessionDelegate 协议(protocol)。要解决该差异,只需将方法的签名更改为如下所示:

- (void)backgroundExecutionOfService:(NSString *)serviceName withParameters:(NSDictionary *)parameters inView:(UIView *)view withDelegate:(id<NSURLSessionDelegate>)delegate{
//... your code
}

并“阅读代表的基础知识。”

关于ios - 传递一个委托(delegate)作为 NSURLSession 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35436132/

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