[問題] setFetchBatchSize 與faulting 一些問題

看板MacDev作者 (flamelad)時間11年前 (2014/08/02 00:59), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
最近在練習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? 以上,再麻煩大家了,我覺得我應該只是卡在些簡單的觀念沒搞清楚。有講解不清的 再煩請告知,我會再修改,感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.237.244 ※ 文章網址: http://www.ptt.cc/bbs/MacDev/M.1406912388.A.196.html
文章代碼(AID): #1JsyU46M (MacDev)
文章代碼(AID): #1JsyU46M (MacDev)