0

我想知道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。

4

2 回答 2

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
}

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

于 2013-04-23T18:51:49.457 回答
1

您可以设置重试计数器并将其放入失败块中,因此它看起来像这样:

        - (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 设置为您需要重试的次数。

于 2013-04-23T18:52:01.630 回答