gpt4 book ai didi

iphone - 为什么滚动表时获取数据很慢?

转载 作者:行者123 更新时间:2023-11-29 04:19:14 24 4
gpt4 key购买 nike

下面的代码与我在 ASI 中使用的代码几乎相同,但现在我使用 AFNetworking。我的猜测是它很慢,因为它在主线程上运行成功 block 。我尝试将 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,它会负责队列的内存管理。因此,当您在方法中声明队列并将其分配给仅分配值的属性(如 AFNetworking 中的 successCallbackQueue 属性声明)时,队列将被释放,并且操作不会保留它,因此它是留下一个 NULL 队列,您将获得错误的访问权限。

所以,解决这个问题的方法是在你的 Controller 中有一个 iVar,它维护对队列的强引用,这样即使操作不保留队列,你的 Controller 也会保留队列,所以它不会被清理从你的脚下。

关于iphone - 为什么滚动表时获取数据很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13216240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com