使用 AFNetworking 避免重复的 HTTP 请求

Posted

技术标签:

【中文标题】使用 AFNetworking 避免重复的 HTTP 请求【英文标题】:avoid duplicate HTTP requests with AFNetworking 【发布时间】:2013-10-07 17:36:58 【问题描述】:

我想知道是否可以。具体来说,我的应用程序可能会生成多个具有相同 url 的 HTTP 请求。我想阻止 AFNetworking 处理相同 url 的重复项。

我不确定这是否可以在 AFNetworking 或底层 ios sdk 中完成。我知道我可以手动跟踪待处理的 url 请求并避免重复,但想知道是否已经有较低级别的功能可以处理这个问题。

谢谢。

【问题讨论】:

【参考方案1】:

最好的办法是继承 AFHTTPRequestOperationManager 的 HTTP 请求操作并在那里跟踪它们,如果您想以相同的方式跟踪每个请求的请求,否则逻辑将需要在其他地方。

AFNetworking 不支持这一点,因为可能存在一些与您应该何时以及何时不应该执行重复请求相关的逻辑,这将是高度可定制的(对于框架来说不够通用)

【讨论】:

【参考方案2】:

我创建了一个类别,用于在发出新请求之前检查正在进行的 GET 请求。

https://github.com/NSElvis/AFHTTPSessionManager-AFUniqueGET

它通过使用会话的getTasksWithCompletionHandler 方法来做到这一点。

【讨论】:

这很好,但需要 AF 2.0。 ResktKit 卡在 1.3 上。呸【参考方案3】:

我遇到了同样的问题。我有一个聊天应用程序,我需要为每条消息显示用户头像。所以我提出了一些相同的要求,我已经解决了这个问题。 首先,我添加NSDictionaryNSString avatar URLs 键和完成块对象:

@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 请求。在成功和失败块中,我清理我的字典。

附:这是我的经理吸气剂:

- (AFHTTPRequestOperationManager*)manager

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

【讨论】:

以上是关于使用 AFNetworking 避免重复的 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking [重复]

使用 AfNetworking 上传图片 [重复]

AFNetworking 3.0 发送请求正文内容 [重复]

在 UITableViewCell 中,UIImageView 内容在使用 AFNetworking 的某些单元格之后重复

AFNetworking 2 - 获取错误 json 正文 [重复]

JSON到带有AFNetworking的NSMutableArray [重复]