給AFNetworking添加請求緩衝功能實現在沒有網路的情況下返回快取資料

來源:互聯網
上載者:User

標籤:ctf   requests   can   RoCE   情況   directory   rman   delegate   count   

原理:先給NSURLSession地Configuration設定一個記憶體和本地代理,原來的網路請求結束後會尋找緩衝的代理字典,並執行代理對象對應的操作方法,需要做的就是攔截錯誤的方法,返回緩衝的資料

 

AFURLSessionManager.m

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {    self = [super init];    if (!self) {        return nil;    }    if (!configuration) {        configuration = [NSURLSessionConfiguration defaultSessionConfiguration];    }    self.sessionConfiguration = configuration;    #pragma mark 在這裡給網路加上一個緩衝    [self addURLCacheForRequestSession:configuration];    self.operationQueue = [[NSOperationQueue alloc] init];    self.operationQueue.maxConcurrentOperationCount = 1;        self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];    self.responseSerializer = [AFJSONResponseSerializer serializer];    self.securityPolicy = [AFSecurityPolicy defaultPolicy];#if !TARGET_OS_WATCH    self.reachabilityManager = [AFNetworkReachabilityManager sharedManager];#endif    self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];    self.lock = [[NSLock alloc] init];    self.lock.name = AFURLSessionManagerLockName;    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {        for (NSURLSessionDataTask *task in dataTasks) {            [self addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil];        }        for (NSURLSessionUploadTask *uploadTask in uploadTasks) {            [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil];        }        for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {            [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil];        }    }];    return self;}#pragma mark 添加緩衝-(void)addURLCacheForRequestSession:(NSURLSessionConfiguration*)configuration{    if ([[[UIDevice currentDevice] systemVersion] compare:@"8.2" options:NSNumericSearch] == NSOrderedAscending) {        configuration.URLCache = [NSURLCache sharedURLCache];    }    else {        configuration.URLCache = [[NSURLCache alloc] initWithMemoryCapacity:5 * 1024 * 1024                                                               diskCapacity:20 * 1024 * 1024                                                                   diskPath:@"customer_request_cache"];    }}

AFURLSessionManagerTaskDelegate  實現方法添加部分代碼

#pragma mark - NSURLSessionTaskDelegate- (void)URLSession:(__unused NSURLSession *)session              task:(NSURLSessionTask *)taskdidCompleteWithError:(NSError *)error{    __strong AFURLSessionManager *manager = self.manager;    __block id responseObject = nil;    __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];    userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer;    //Performance Improvement from #2672    NSData *data = nil;    if (self.mutableData) {        data = [self.mutableData copy];        //We no longer need the reference, so nil it out to gain back some memory.        self.mutableData = nil;    }    if (self.downloadFileURL) {        userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL;    } else if (data) {        userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = data;    }    if (error) {#pragma mark 網路錯誤時讀取網路快取資料        if (error.code == -1009) {            NSURLCache *cache = self.manager.session.configuration.URLCache;            if (cache) {                NSCachedURLResponse *response = [cache cachedResponseForRequest:task.currentRequest];                dispatch_async(url_session_manager_processing_queue(), ^{                    NSError *serializationError = nil;                    responseObject = [manager.responseSerializer responseObjectForResponse:response.response data:response.data error:&serializationError];                                        if (self.downloadFileURL) {                        responseObject = self.downloadFileURL;                    }                                        if (responseObject) {                        userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject;                    }                                        if (serializationError) {                        userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError;                    }                                        dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{                        if (self.completionHandler) {                            self.completionHandler(response.response, responseObject, serializationError);                        }                        dispatch_async(dispatch_get_main_queue(), ^{                            [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];                        });                    });                });            }        }        else {            userInfo[AFNetworkingTaskDidCompleteErrorKey] = error;                        dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{                if (self.completionHandler) {                    self.completionHandler(task.response, responseObject, error);                }                                dispatch_async(dispatch_get_main_queue(), ^{                    [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];                });            });        }            } else {        dispatch_async(url_session_manager_processing_queue(), ^{            NSError *serializationError = nil;            responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:data error:&serializationError];            if (self.downloadFileURL) {                responseObject = self.downloadFileURL;            }            if (responseObject) {                userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject;            }            if (serializationError) {                userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError;            }            dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{                if (self.completionHandler) {                    self.completionHandler(task.response, responseObject, serializationError);                }                dispatch_async(dispatch_get_main_queue(), ^{                    [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];                });            });        });    }}

 

//網路請求錯誤碼enum {    NSURLErrorUnknown = -1,    NSURLErrorCancelled = -999,    NSURLErrorBadURL = -1000,    NSURLErrorTimedOut = -1001,    NSURLErrorUnsupportedURL = -1002,    NSURLErrorCannotFindHost = -1003,    NSURLErrorCannotConnectToHost = -1004,    NSURLErrorDataLengthExceedsMaximum = -1103,    NSURLErrorNetworkConnectionLost = -1005,    NSURLErrorDNSLookupFailed = -1006,    NSURLErrorHTTPTooManyRedirects = -1007,    NSURLErrorResourceUnavailable = -1008,    NSURLErrorNotConnectedToInternet = -1009,    NSURLErrorRedirectToNonExistentLocation = -1010,    NSURLErrorBadServerResponse = -1011,    NSURLErrorUserCancelledAuthentication = -1012,    NSURLErrorUserAuthenticationRequired = -1013,    NSURLErrorZeroByteResource = -1014,    NSURLErrorCannotDecodeRawData = -1015,    NSURLErrorCannotDecodeContentData = -1016,    NSURLErrorCannotParseResponse = -1017,    NSURLErrorInternationalRoamingOff = -1018,    NSURLErrorCallIsActive = -1019,    NSURLErrorDataNotAllowed = -1020,    NSURLErrorRequestBodyStreamExhausted = -1021,    NSURLErrorFileDoesNotExist = -1100,    NSURLErrorFileIsDirectory = -1101,    NSURLErrorNoPermissionsToReadFile = -1102,    NSURLErrorSecureConnectionFailed = -1200,    NSURLErrorServerCertificateHasBadDate = -1201,    NSURLErrorServerCertificateUntrusted = -1202,    NSURLErrorServerCertificateHasUnknownRoot = -1203,    NSURLErrorServerCertificateNotYetValid = -1204,    NSURLErrorClientCertificateRejected = -1205,    NSURLErrorClientCertificateRequired = -1206,    NSURLErrorCannotLoadFromNetwork = -2000,    NSURLErrorCannotCreateFile = -3000,    NSURLErrorCannotOpenFile = -3001,    NSURLErrorCannotCloseFile = -3002,    NSURLErrorCannotWriteToFile = -3003,    NSURLErrorCannotRemoveFile = -3004,    NSURLErrorCannotMoveFile = -3005,    NSURLErrorDownloadDecodingFailedMidStream = -3006,    NSURLErrorDownloadDecodingFailedToComplete = -3007}

 

給AFNetworking添加請求緩衝功能實現在沒有網路的情況下返回快取資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.