我的第一個問題是如何計劃確定兩個物體何時使用相同的圖像?您可以存儲和查詢圖像上的屬性,以確定您設置的圖像是否已經存在?從計算上來說,這有多昂貴?如果花費很多時間,則可能會優化存儲並影響性能。但是,如果您確實有辦法有效地完成此操作,則可以創建一個ImageBlob
實體來執行您所描述的操作。使用ImageBlob
的實體應與ImageBlob
有imageBlob
或imageBlobs
關係。 ImageBlob
應該與名稱相反,例如users
。
在你的代碼,當你想重用ImageBlob
,這是因爲做這樣的事情非常簡單:
NSManagedObject *blob = // get the image blob
NSManagedObject *user = // get the user
[user setValue:blob forKey:@"imageBlob"]; // do this if it uses a single image
[[user mutableSetValueForKey:@"imageBlobs"] addObject:blob]; // do this if it uses multiple images
你要考慮的另一個考慮是如何處理那些沒有斑點做需要更長時間據推測,你想刪除任何未使用的圖像。爲此,您可以爲NSManagedObjectContextObjectsDidChangeNotification
通知註冊您的應用程序委託或NSPersistentDocument
子類(具體取決於您的應用程序是否基於文檔)。每當管理對象環境的變化,你可以刪除任何不需要的圖像是這樣的:
- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification {
NSManagedObjectContext *managedObjectContext = [notification object];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 0"];
NSArray *unusedBlobs = [managedObjectContext executeFetchRequest:fetchRequest error:nil]; // Don't be stupid like me; catch and handle the error
[fetchRequest release];
for (NSManagedObject *blob in unusedBlobs) {
[managedObjectContext deleteObject:blob];
}
}
謝謝,這是一個有用的建議。這不是一個完整的解決方案,但我接受了答案。 – 2009-10-28 01:08:53