2013-10-07 105 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; 
}