最近在练习cs193p中的coredata实做,遇上了一些问题,google了两三天,不过还是
没有解套,因此只能来这边麻烦大家。新手发问还请多包涵,谢谢。
(由于人在外地,不是使用自己的电脑没有code可以贴,有不清楚还多请见谅)
问题1. NSFetchRequest的setFetchBatchSize怎么运作?
在实做中,我用NSFetchRequest hook NSFetchResultController来取MOC中的
entity's attribute,在NSFetchRequest中有setFetchBatchSize。
我理解的两种解释,第一种是当有设定BatchSize时,则从persistentStore 取到的资料笔
数就是size数并取N次;第二种则是会加载全部资料,但动态加载BatchSize数量到NSArray
(目前文件看到是第一种解释)。我透过SQLDebug方式去看coredata执行SQL的结果,以及
count取得的资料笔数,却非上述两种解释,请问是否我的理解有误或code有误?
大概的code segment:
NSFetchRequest *fetchReq=[NSFetchReqeust fetchRequestWithEntityName:@"Photo"];
fetchReq.fetchBatchSize =10;
fetchReq.sortDescriptors=@[[[NSSortDescriptor alloc] initWithKey:@"title"
ascending:YES]];
NSFetchRequestController *FRC=[NSFetchRequestController alloc];
[FRC initWithFetchRequest:fetchReq
managedObjectContext:self.document.managedObjectContext
sectionNameKeyPath:@"title"
cacheName:nil];
问题2. coredata的faulting机制
其实是在解决问题1的时候,延伸出来的问题。faulting机制是指data动态加载
(已经从NSFetchRequest fetch data至NSArray),也就是get @property时才会加载data
至memory。
我在get @property之前与之后,也确实看到在get之前是没有data放入NSArray
中,get之后就会加载data。但问题是我使用malloc_size去看NSArray在get @property
之前与之后的内存配置,并没有两样呀?按照文件所述,应该是加载前memory配置少
,加载后配置多,请问我哪边理解错误了吗?而fetchBatchSize正确来说,应该就是设
定每次加载的数量,count的数量应该等同于BatchSize,这样理解对吗?
大概的code segment:
NSError *error;
NSArray *data=[self.document.managedObjectContext executeFetchRequest:
fetchReq
error:&error];
NSLog(@"%zd", malloc_size((__bridge const void*)(data))); //always 32 byte
for(id *tmp in data){
NSLog(@"%@", tmp.title);
}
NSLog(@"%zd", malloc_size((__bridge const void *)(data)));//always 32 byte
P.S.:当中有另外[data class],return是_PFArray,是coredata的一个subclass of
NSArray,目前还没时间厘清,但个人猜测malloc_size是不是计算到_PFArray
中的基本data type如int等的bytes?
以上,再麻烦大家了,我觉得我应该只是卡在些简单的观念没搞清楚。有讲解不清的
再烦请告知,我会再修改,感谢。