我有一个带有 UITableViewController 的示例应用程序。
与 facebook 新闻源一样,该应用程序应该下载第一次 X 新闻,然后随着用户滚动逐步获取新闻。
这是我的实现:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.row == self.newsList.count-PADDLE_BEFORE_FETCHING && !cantFetchMore)
if (!fetching){
fetching = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[self fetchNews];
});
}
}
(我们的想法是当我们到达 N-PADDLE_BEFORE_FETCHING 单元时开始获取额外的新闻,前提是我们仍然可以获取一些 - 见下文 - 并且当前仍然没有运行获取)
然后执行 fetchNews :
-(void)fetchNews{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *url = [NSString stringWithFormat:@"%@%@%@%@%d%@",HOSTNAME,GET_NEWS,[defaults objectForKey:@"oAuthToken"],@"&limit=",FETCH_SIZE_NEWS,[NSString stringWithFormat:@"&offset=%d",self.newsList.count]];
NSURLRequest *request =[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
#if DEVELOPMENT_MODE
NSLog(@"News : %@",JSON);
NSLog(@"Response : %@\n Request : %@",response,request);
#endif
//NSLog(@"Number of news fetched : %d",((NSArray*)JSON[@"data"]).count);
for (NSDictionary *d in JSON[@"data"]){
News *new = [[News alloc] initWithDictionary:d];
[self.newsList addObject:new];
new = nil;
}
if ((((NSArray*)JSON[@"data"]).count)%FETCH_SIZE_NEWS !=0) cantFetchMore = YES;
//NSLog(@"%d cantFetch",cantFetchMore);
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[self.tableView reloadData];
fetching = NO;
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"Request error : %@ %@ %@",request,error, JSON);
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
fetching = NO;
}];
[operation start];
}
这将从新闻列表数组的当前大小的良好偏移量开始从服务器获取 FETCH_SIZE_NEWS 附加新闻。此外,如果获取新闻的计数 % FETCH_SIZE_NEWS 不为 0,这意味着我们无法获取其他新闻(这将阻止在滚动 UITableView 时调用 web 服务)。
我的问题是,当提取完成时(当我看到状态栏中正在运行的活动轮时),它会阻塞 GUI,我不能继续从 n-PADDLE_BEFORE_FETCHING 单元格向下滚动到 n 个单元格,甚至滚动直到之前加载的单元格。
我真的不明白为什么 AFNetworking 应该异步运行。
有任何想法吗?
谢谢,