3使用NSFetchedResultsController通过AFIncrementalStore对每个对象进行请求

时间:2013-05-08 17:10:03

标签: uitableview core-data afnetworking nsfetchedresultscontroller afincrementalstore

我已经使用AFIncrementalStore设置了所有内容,以使用Parse作为后端服务。使用这样的服务会使计数API请求变得很重要,好像我每月超过1MM请求(虽然成功的指标!)可能会导致一些体面的账单。这通常不是问题,但我所看到的,如果我在AFHTTPClient中使用以下方法设置断点:

- (void)enqueueHTTPRequestOperation:(AFHTTPRequestOperation *)operation;

我发现对特定对象的请求发生了3次,而我只需要一次。

$1 = 0x0b9afe30 https://api.parse.com/1/classes/Poem/cUpTflj0j8
// ...
$8 = 0x099e0a30 https://api.parse.com/1/classes/Poem/cUpTflj0j8
...
$18 = 0x0bb6d530 https://api.parse.com/1/classes/Poem/cUpTflj0j8

请注意,不同的内存地址来自AFHTTPRequestOperation,我打印request.URL属性以检查每个请求中的objectId(URL末尾的随机字符串)。

现在,我对NSIncrementalStoreAFIncrementalStore的工作方式不够熟悉,经过两天的调试和检查后才弄清楚这一点。我很想听听有关可能造成这种情况的任何想法,无论是有意还是无意。

我可能会补充说我正在使用NSFetchedResultsControllerUITableView。我跟踪了对象的第一个请求的堆栈跟踪到我的tableview的数据源。其他2个请求追溯到AFIncrementalStore内部的方法。

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // ...
    NSManagedObject *poem = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [poem valueForKey:@"title"];  // traced back to here
    // ...
}

1 个答案:

答案 0 :(得分:1)

选项可能是设置NSURLCache,如此:

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:8 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];

[NSURLCache setSharedURLCache:URLCache];

这应该使用8 MB RAM和20 MB磁盘缓存设置URLCache

要检查线路上是否还有这么多请求,可以使用wiresharkcocoapacketanalyser等工具。