我想這只是一個事件順序的例子,而不是一個實際的例子。
你有沒有偶然忘記給ManagedObjectContext一個NSUndoManager?
我相信你會得到一個默認情況下在OS X下,但在iOS下,你必須專門提供一個。
你要確保當您創建MOC設置撤消管理...
managedObjectContext.undoManager = [[NSUndoManager alloc] init];
如果撤消經理是零,這樣做後,那麼你正在使用多個MOCS,或一些其他代碼已將其重置。
另外,出於調試的目的,請檢查appointment.managedObjectContext屬性,並確保它不爲零並引用有效的MOC。
編輯
好吧,我只是去寫了一個快速測試,用一個簡單的模型。也許你應該做類似的事情,看看你的斷言失敗的地方(你可以在你的代碼路徑中添加正常的斷言 - 我做了一個單元測試,所以我可以輕鬆地將它添加到現有的項目)。
- (void)testUndoManager
{
NSDate *now = [NSDate date];
NSManagedObjectContext *moc = [self managedObjectContextWithConcurrencyType:NSConfinementConcurrencyType];
STAssertNil(moc.undoManager, @"undoManager is nil by default in iOS");
moc.undoManager = [[NSUndoManager alloc] init];
[moc.undoManager beginUndoGrouping];
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:EVENT_ENTITY_NAME inManagedObjectContext:moc];
STAssertNotNil(moc, @"Managed Object is nil");
STAssertEquals(moc, object.managedObjectContext, @"MOC of object should be same as MOC");
STAssertNotNil(object.managedObjectContext.undoManager, @"undoManager of MOC should not be nil");
[object setValue:now forKey:@"timestamp"];
STAssertEqualObjects(now, [object valueForKey:@"timestamp"], @"Timestamp should be NOW");
[moc.undoManager endUndoGrouping];
STAssertEqualObjects(now, [object valueForKey:@"timestamp"], @"Timestamp should be NOW");
[moc.undoManager undo];
STAssertNil([object valueForKey:@"timestamp"], @"Object access should be nil because changes were undone");
}
EDIT
被管理對象的MOC可以幾種條件下被設置爲零。例如,如果你刪除了一個對象,然後保存國防部,商務部將被設置爲無該對象...
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"SomeEntity" inManagedObjectContext:moc];
[object.managedObjectContext deleteObject:object];
[moc save:0];
// object.managedObjectContext will be nil
另一個不那麼常見的情況,但一個跡象,表明有可能是內存問題與MOC ...在ARC下,被管理對象的MOC是一個弱指針。因此,如果MOC消失,該指針將被重置爲零。在非ARC的情況下,指針只會有舊的值,並且您的結果將不確定...可能是崩潰。
所以,如果managedObject。managedObjectManager爲零,最有可能的罪魁禍首是:
- 對象從來沒有插入MOC
- 的對象是從MOC
- 的MOC被刪除
是的,這是一個例子。事實上,我做了一個setUndoManager,但是這樣做後它仍然爲空。 – Bot 2012-04-24 22:01:23
你有沒有在文檔中提到在iOS下說的地方,你必須明確地提供一個撤銷管理器? – 2016-10-06 18:21:56
確定我的一位同事找到了引用:https://developer.apple.com/reference/coredata/nsmanagedobjectcontext/1506663-undomanager – 2016-10-06 18:42:57