我想知道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]];
}
} [...]
}
所以,我想知道这是否是其他/更好的方式来做我想要的。
Subquestion
数组(NSArray *)[data valueForKey:@"is_deleted"]
由BOOL int值组成。我想知道是否可以轻松计算包含整数的数组的值,例如: [1,1,1,0] = 3?我想检查数组中的所有值是否为1:s。
答案 0 :(得分: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
中的操作,则保留周期。)
答案 1 :(得分: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设置为您需要重试的次数。