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

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

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

谢谢。

【问题讨论】:

    标签: ios objective-c ios7 afnetworking afnetworking-2


    【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多