【问题标题】:AFNetworking, callback when finished request?AFNetworking,完成请求时回调?
【发布时间】:2013-04-23 18:11:34
【问题描述】:

我想知道AFNetworking完成请求时是否可以得到回调?我正在制作一个有边缘案例的应用程序,所有下载的项目都经过检查is_deleted(并且不应显示在 UI 中)。如果是这种情况,我想自动尝试下载旧数据(创建一个新的AFNetworking 请求)。

我试图再次调用我的loadData 方法,从它本身。但它创建了一个不定式循环。像这样:

- (void)loadDataIsOlder:(NSNumber *)older
{    
    NSURLRequest *request = [NSURLRequest requestWithURL:self.streamUrl];
    AFJSONRequestOperation *operation;
    operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonObject) {
        NSDictionary *data = [jsonObject objectForKey:@"data"];
        NSDictionary *meta = [jsonObject objectForKey:@"meta"];
       [...]
        for (NSNumber *deleted in (NSArray *)[data valueForKey:@"is_deleted"]) {
            if ([deleted boolValue] == YES) {
                self.shouldTryToLoadMore = YES;
            } else {
                self.shouldTryToLoadMore = NO;
            }
        }
        if (self.shouldTryToLoadMore == YES) {
            [self loadDataIsOlder:[NSNumber numberWithBool:YES]];
        }
    } [...]
}

所以,我想知道这是否是做我想做的其他/更好的方法。

子问题 数组 (NSArray *)[data valueForKey:@"is_deleted"] 由 BOOL int 值组成。我想知道是否可以轻松计算包含整数的数组的值,例如[1, 1, 1, 0] = 3?我想检查数组中的所有值是否都是 1:s。

【问题讨论】:

    标签: ios xcode cocoa-touch nsarray afnetworking


    【解决方案1】:

    我不熟悉 AFNetworking

    我想知道AFNetworking完成请求时是否可以得到回调?

    您始终可以设置操作的完成块(即使在失败时也会被调用,在操作运行的线程上,因此要小心 UI 更新)。
    像这样:operation.completionBlock = ^{/*what ever you like to accomplish*/};

    检查所有已下载的项目 is_deleted

    我在您的算法中发现了一个小问题。
    您没有正确累积删除键(您只响应最后一项状态)。
    尝试:self.shouldTryToLoadMore &= [deleted boolValue]; 而不是您的 if 语句。

    如果您喜欢短路(以避免“可见”循环),请尝试:

    NSMutableSet* set = [NSMutableSet setWithArray:[data valueForKey:@"is_deleted"]];
    [set addObject:@YES];
    if ([set count] == 1) {
    //You have only deleted items in your request
    }
    

    注意
    您正在成功块中捕获self,这可能有问题(如果您拥有self 中的操作,则保留周期)。

    【讨论】:

      【解决方案2】:

      你可以设置一个重试计数器并将它放在失败块中,所以它看起来像这样:

              - (void)loadDataIsOlder:(NSNumber *)older
          {   
       if (shouldTrytoReloadMore){
              NSURLRequest *request = [NSURLRequest requestWithURL:self.streamUrl];
              AFJSONRequestOperation *operation;
              operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonObject) {
                  NSDictionary *data = [jsonObject objectForKey:@"data"];
                  NSDictionary *meta = [jsonObject objectForKey:@"meta"];
                 [...]
                  for (NSNumber *deleted in (NSArray *)[data valueForKey:@"is_deleted"]) {
                      if ([deleted boolValue] == YES) {
                          self.shouldTryToLoadMore = YES;
                          [self loadDataIsOlder:[NSNumber numberWithBool:YES]];
      
                      } else {
                          self.shouldTryToLoadMore = NO;
                      }
                  }
                  }
              } [...]
          }
      failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
      }
      

      当你第一次调用该方法时,设置n为你需要重试的次数。

      【讨论】:

      • 谢谢,但我不知道在获取数据之前是否需要重试。这个解决方案还能用吗?
      • 抱歉误读了这个问题。您可以将数组中的所有 BOOL 相加并与数组中的总数进行比较,这将判断数组中的所有值是否都是 1
      • 我认为您首先正确阅读了这个问题。但我只知道是否需要重试该方法,当我在方法中(或获取数据)时,而不是之前。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2018-11-08
      • 1970-01-01
      相关资源
      最近更新 更多