设计单例实例 AFNetworking 3 中的 IOS 错误

标签 ios singleton afnetworking

您好,我正在为 AFNetworking 3.x 构建单例实例

我的 ApiClient.h

@interface ApiClient : AFHTTPSessionManager
+ (ApiClient *)sharedInstance;

-(instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration;

我的 ApiClient.m

+ (ApiClient *)sharedInstance {
    static ApiClient *sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
        sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:SINGPOST_BASE_URL] sessionConfiguration:sessionConfiguration];

    });
return sharedInstance;
}

问题是我无法启动单例实例

-(instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration {

    [super initWithBaseURL:url sessionConfiguration:url];
    return self;
}

我有 2 个错误,如下图 enter image description here

谁知道。我的单例设计有什么问题?非常感谢任何帮助!谢谢

PS:我试过 initwithURL 没有 session 配置就不行

更新。有错别字。正确的应该是

-(instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration {
    self = [super initWithBaseURL:url sessionConfiguration:configuration];

        if (self) {
//            self.responseSerializer = [AFHTTPResponseSerializer serializer];
//            self.requestSerializer = [AFHTTPRequestSerializer serializer];
            [self setDataTaskWillCacheResponseBlock:^NSCachedURLResponse *(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse)
             {
                 NSHTTPURLResponse *resp = (NSHTTPURLResponse*)proposedResponse.response;
                 NSMutableDictionary *newHeaders = [[resp allHeaderFields] mutableCopy];
                 if (newHeaders[@"Cache-Control"] == nil) {
                     newHeaders[@"Cache-Control"] = @"max-age=120, public";
                 }

                 //             NSHTTPURLResponse *response2 = [[NSHTTPURLResponse alloc] initWithURL:resp.URL statusCode:resp.statusCode HTTPVersion:@"1.1" headerFields:newHeaders];

                 NSURLResponse *response2 = [[NSHTTPURLResponse alloc] initWithURL:resp.URL statusCode:resp.statusCode HTTPVersion:nil headerFields:newHeaders];
                 NSCachedURLResponse *cachedResponse2 = [[NSCachedURLResponse alloc] initWithResponse:response2
                                                                                                 data:[proposedResponse data]
                                                                                             userInfo:[proposedResponse userInfo]
                                                                                        storagePolicy:NSURLCacheStorageAllowed];
                 return cachedResponse2;
             }];
        }

    return self;
}

它现在工作正常,但每当我尝试再次调用 View Controller 时。响应序列化程序无法正常工作(第二次调用)有不正确的响应,而第一次调用给出正确的响应序列化程序)。结果导致应用程序崩溃

我对第二次调用 viewcontroller 的奇怪 react enter image description here

最佳答案

当实现init方法时,你想说self = ...,例如

- (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration {
    self = [super initWithBaseURL:url sessionConfiguration:configuration];

    if (self) {
        // do additional configuration here
    }

    return self;
}

关于设计单例实例 AFNetworking 3 中的 IOS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39023923/

相关文章:

ios - 如何为倒计时器创建循环进度指示器

ios - iOS Objective C 中的单例不会阻止多个实例

java - 线程安全方法

ios - NSURL 路径的带反斜杠的转义序列

iphone - 使用社交框架将图像添加到 Facebook

ios - NSURLSession 子类化

objective-c - ARC、非 ARC 和继承

ios - 传输安全已阻止明文 HTTP

ios - 这个 Swift 代码是如何工作的??!!

java - GSON/JSON 单例反序列化