[問題] setFetchBatchSize 與faulting 一些問題

作者: flamelad (flamelad)   2014-08-02 00:59:46
最近在練習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?
以上,再麻煩大家了,我覺得我應該只是卡在些簡單的觀念沒搞清楚。有講解不清的
再煩請告知,我會再修改,感謝。

Links booklink

Contact Us: admin [ a t ] ucptt.com