2013-10-07 35 views
2

我想知道是否有可能通過AFNetworking避免重複的HTTP請求。具體來說,我的應用程序可能會生成多個HTTP請求,它們都具有相同的URL。我想阻止AFNetworking處理同一網址的重複。通過AFNetworking避免重複的HTTP請求

我不確定這是否可以在AFNetworking或底層的iOS sdk中完成。據我所知,我可以手動保留待處理url請求的trac,並避免重複的方式,但想知道是否有一個較低級別的功能已經可以照顧到這一點。

謝謝。

回答

2

最好的辦法是繼承AFHTTPRequestOperationManager的HTTP請求操作的子類並在那裏跟蹤它們,如果你想以同樣的方式爲每個請求跟蹤請求,否則邏輯將需要在別處。

AFNetworking不支持這一點,因爲有可能是一些相關的時候,你應該和邏輯時,你不應該執行重複的請求,這將是高度可定製的(沒有足夠的通用的框架)

0

我一樣的問題。我有一個聊天應用程序,我需要爲每條消息顯示用戶頭像。所以我提出了幾個相同的要求,我已經解決了這個問題。 首先,我想補充NSDictionaryNSString頭像的URL鍵和結束塊對象:

@property (strong, nonatomic) NSMutableDictionary* successBlocksDictForGetAvatar; 

這是我的方法來獲取用戶的頭像圖片:

- (void)getAvatarForUser:(ETBUser*)user 
       completion:(void(^)())completionBlock 
{ 
    if (user.avatarURL) 
    { 
     NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:user.avatarURL]]; 
     if (self.successBlocksDictForGetAvatar[user.avatarURL]) 
      [self.successBlocksDictForGetAvatar[user.avatarURL] addObject:completionBlock]; 
     else 
     { 
      NSMutableSet* set = [[NSMutableSet alloc] initWithObjects:completionBlock, nil]; 
      [self.successBlocksDictForGetAvatar setObject:set forKey:user.avatarURL]; 

      AFHTTPRequestOperation* operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
      [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
       UIImage* avatarImage = [UIImage imageWithData:responseObject]; 
       if (avatarImage) 
       { 
        user.avatar = avatarImage; 
        [[DataManager shared] saveAvatar]; 
        [((NSSet*)self.successBlocksDictForGetAvatar[user.avatarURL]) enumerateObjectsUsingBlock:^(void(^successBlock)(), BOOL *stop) { 
         successBlock(); 
        }]; 
        [self.successBlocksDictForGetAvatar removeObjectForKey:user.avatarURL]; 
       } 
      } 
              failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
               [self.successBlocksDictForGetAvatar removeObjectForKey:user.avatarURL]; 
              }]; 
      [self.manager.operationQueue addOperation:operation]; 
     } 
    } 
} 

這裏檢查我的詞典中包含的請求。如果是,我在詞典中爲用戶添加完成塊。否則我setObject:forKey:AFNetworking請求。在成功和失敗塊我清理我的字典。

P.S.這裏是我的經理getter:

- (AFHTTPRequestOperationManager*)manager 
{ 
    if (!_manager) 
    { 
     _manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:kBaseURL]; 
     [_manager.requestSerializer setValue:NetworkConstantsHeaderAcceptValue forHTTPHeaderField:NetworkConstantsHeaderAcceptKey]; 
     [_manager.operationQueue setMaxConcurrentOperationCount:1]; 
    } 
    return _manager; 
}