How do I set a request timeout and cache policy in AFNetworking 2.0?

前端 未结 5 1730
夕颜
夕颜 2021-02-01 17:08

I\'m following the given example code

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@\"http://example.com/resour         


        
相关标签:
5条回答
  • 2021-02-01 17:45

    I'm a bit lazy to categorize or subclass. You can access the manager's request serializer directly:

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.requestSerializer.timeoutInterval = INTERNET_TIMEOUT;
    manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
    
    0 讨论(0)
  • 2021-02-01 17:47

    The best is to create a subclass

    (you can also the same way add cache policy)

    TimeoutAFHTTPRequestSerializer.h

    #import "AFURLRequestSerialization.h"
    
    @interface TimeoutAFHTTPRequestSerializer : AFHTTPRequestSerializer
    
    @property (nonatomic, assign) NSTimeInterval timeout;
    
    - (id)initWithTimeout:(NSTimeInterval)timeout;
    
    @end
    

    TimeoutAFHTTPRequestSerializer.m

    #import "TimeoutAFHTTPRequestSerializer.h"
    
    @implementation TimeoutAFHTTPRequestSerializer
    
    - (id)initWithTimeout:(NSTimeInterval)timeout {
    
        self = [super init];
        if (self) {
            self.timeout = timeout;
        }
        return self;
    
    }
    
    - (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                     URLString:(NSString *)URLString
                                    parameters:(NSDictionary *)parameters
                                         error:(NSError *__autoreleasing *)error
    {
        NSMutableURLRequest *request = [super requestWithMethod:method URLString:URLString parameters:parameters error:error];
    
        if (self.timeout > 0) {
            [request setTimeoutInterval:self.timeout];
        }
        return request;
    }
    
    @end
    

    Use

    self.requestOperationManager.requestSerializer = [[TimeoutAFHTTPRequestSerializer alloc] initWithTimeout:30];
    
    0 讨论(0)
  • 2021-02-01 17:48

    Take a look at Method 1 for a cleaner way to do it: https://stackoverflow.com/a/21238330/435040

    The difference is that I'm using subclassing and I'm not patching AFNetworking's code.

    One thing that I forgot to mention. In that answer I'm only changing the timeout interval, but adding some other caching policy is just 1 more line of code.

    0 讨论(0)
  • 2021-02-01 17:51

    You can also create a category AFHTTPRequestOperationManager+timeout to add this method without having to subclass AFHTTPRequestOperationManager.

    0 讨论(0)
  • 2021-02-01 17:53

    Try something like :

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:kRequestTimout];
    

    where kRequestTimout is the timeout duration you want

    Then build your serialized request :

    NSURLRequest *serializedRequest = [self.requestOperationManager.requestSerializer requestBySerializingRequest:request withParameters:parameters error:&error];
    

    And create & add your request operation :

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:serializedRequest];
    [operation setCompletionBlockWithSuccess:successBlock failure:failureBlock];
    [self.requestOperationManager.operationQueue addOperation:operation];
    
    0 讨论(0)
提交回复
热议问题