2

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

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

谢谢。

4

3 回答 3

3

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

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

于 2013-10-07T17:47:31.123 回答
1

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

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

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

于 2014-11-17T23:11:15.140 回答
0

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

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

PS这是我的经理吸气剂:

- (AFHTTPRequestOperationManager*)manager
{
    if (!_manager)
    {
        _manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:kBaseURL];
        [_manager.requestSerializer setValue:NetworkConstantsHeaderAcceptValue forHTTPHeaderField:NetworkConstantsHeaderAcceptKey];
        [_manager.operationQueue setMaxConcurrentOperationCount:1];
    }
    return _manager;
}
于 2014-04-29T09:43:15.623 回答