下面的代码与我在ASI上使用的代码几乎相同,但是现在我在使用AFNetworking。我的猜测是它很慢,因为它在主线程上运行成功块。我试图将successCallbackQueue设置为新队列,但是它似乎无法正常工作。这只是非常缓慢,不能有效地做到这一点。如何提高它的速度或确保它在后台线程中运行?
#define kPerPage 10
- (void) pullData {
NSURL *url = [API homeRecentUrlWithPage:self.currentRecentPage limit:kPerPage];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
AFJSONRequestOperation *operation;
operation.successCallbackQueue = requestQueue;
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSArray* modelArray = [JSON objectForKey:@"models"];
for (int i = 0; i < [modelArray count]; i++)
{
Model *b = [Model alloc];
b = [b initWithDict:[Model objectAtIndex:i]];
[self.otherArray addObject:b];
}
[_modelTable reloadData];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"%@", [error userInfo]);
}];
[operation start];
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString* identifier = @"ModelTableCell";
cell = (ModelTableCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[ModelTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
cell.selectionStyle = UITableViewCellAccessoryNone;
}
if([indexPath row] == (self.currentRecentPage-1) * kPerPage + 5) {
NSLog(@"%d aaa", self.currentRecentPage);
self.currentRecentPage++;
[self pullData];
}
Model *b = [self.models objectAtIndex:[indexPath row]];
[cell populateWithModel:b];
return cell;
}
最佳答案
我认为您没有为回调正确设置队列
您将回调队列分配给一个操作,然后创建一个覆盖它的操作。
// You create the queue
dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
// You declare an operation, but you don't create it.
AFJSONRequestOperation *operation;
// You assign the requestQueue to this uninitialised operation
operation.successCallbackQueue = requestQueue;
// You create the operation here, and it overwrites the requestQueue you have set
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
您应该在创建操作后设置successCallbackQueue。
编辑添加更多
我的阅读更多。在GCD上以及在Mountain Lion或iOS6应用程序上,如果使用ARC,它将负责队列的内存管理。因此,当您在方法中声明队列并将其分配给仅分配值的属性(如successCallbackQueue属性在AFNetworking中声明)时,该队列将被释放,并且该操作不会保留在该队列上,因此留下一个空队列,您将获得错误的访问权限。
因此,解决此问题的方法是在控制器中拥有一个iVar,该iVar维护对队列的强引用,因此即使操作未保留队列,您的控制器也将保留,因此不会从您身下清除它。