2011-06-01 137 views
0

在覈心數據中,當使用setPrimitiveValue與對象的常規訪問器方法進行更改時,是否有一些技巧保存對託管對象屬性的更改?核心數據:setPrimitiveValue並保存更改

爲了避免觸發我的FRC的通知方法(controllerWillChangeContent,controllerDidChangeObject等),我已經在幾種情況下切換到使用setPrimitiveValue和setPrimitiveAttributeName。在這兩種情況下,在對核心數據對象進行更改並保存託管對象上下文之後,這些更改看起來像是他們所做的(即我可以看到NSLog中的更改),但實際上它們已丟失(即,如果退出應用程序模擬器並重新運行它,FRC重新加載,以及我認爲我改變的屬性都消失了)。

從Apple示例複製保存代碼,並且我的Core Data實體的託管對象類由Xcode生成。一切我已經從蘋果公司和本網站表明,這是對setPrimitive方法的有效使用讀,雖然我承認我必須缺少的這些setPrimitive功能到底是如何工作的一些理解......

代碼:

// header file for Managed Object sub class generated by xcode from my core data entity: 
#import <CoreData/CoreData.h> 
@interface PlannedItem : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSNumber * ptType; 
@property (nonatomic, retain) NSNumber * whenOrder; 
@end 

// .m file for Managed Object subclass 
#import "PlannedItem.h" 
@implementation PlannedItem 

@dynamic ptType; 
@dynamic whenOrder; 

@end 

// trying to use setPrimitiveValue or even setPrimitiveWhenOrder to modify 
// this is in my view controller 
// p is a pointer to PlannedItem 
int oldOrder = [p.whenOrder intValue]; 
[p setPrimitiveValue:[NSNumber numberWithInt:(oldOrder +1)] forKey:@"whenOrder"]; 


// later on in same method, save is executed. 
if (![[self managedObjectContext] save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 
NSLog(@"Saved");  

感謝您的任何提示

+0

hmmmmm ....貌似willChangeValueForKey和didChangeValueForKey就是我要找的。我不能發佈答案,但我會稍後,如果我不碰到一個更好的建議... – kris 2011-06-01 20:04:19

+1

我收回 - willChangeValueForKey和didChangeValueForKey正在幫助,但他們導致FRC再次調用內容更改通知給代表。我想我希望我的FRC和一切都能夠及時更新我使用setPrimtiveValue所做的更改,但是我也不想在這種情況下運行這些內容更改通知方法。我想我不能雙方都有,我可以嗎? – kris 2011-06-01 20:27:39

+0

KVO調用willChange等是必須的核心數據在此之後開始行動。 – Jonathan 2011-06-02 00:29:58

回答

2

如果您不想在通知處理程序要執行的代碼(順便說一句,爲什麼你想嗎?),它可能是更容易禁用,而不是完全避免通知。此外,請記住,核心數據使用這些通知更新您的關係,並在您進行更改時保持模型的一致性。

在您的視圖控制器中,設置一個布爾值並根據您的需要設置它,以執行通知處理程序代碼。然後,在你處理程序檢查標誌,例如:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    if (notificationIgnored) { 
     return; 
    } 
    // rest of the code... 
} 
+0

我不希望代碼通知處理程序執行的原因是更新的屬性只是由fetchedResultsController支持的UITableView的顯示順序。 – kris 2011-06-02 18:11:36

+0

因此,當我添加一個對象時,現在我更新所有後續行的顯示順序。如你所描述的那樣使用一個標誌應該可以工作,但對我來說它並不是一個非常乾淨的解決方案,它給了我很多奇怪的錯誤。我希望我可以使用setPrimitiveValue來避免觸發處理程序的額外更新。唉解決方案辛迪描述看起來像最好的選擇。 – kris 2011-06-02 18:32:21