2014-02-18 89 views
0

CoreData存在問題,我不知道任何進一步的信息。我將它與ICloud一起使用並在兩款iPhone上進行測試。mergeChangesFromContextDidSaveNotification中的核心數據崩潰 - >調用循環

現在我在兩個手機上開始我的應用程序。我在一部手機上添加了一條記錄。只要兩部手機切換到「使用本地存儲:0」,我就可以在一部手機(接收更改通知的手機)上看到內存。

它發生在調用[self.howRUDocument.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];方法。當我調試時,mergeChangesFromContextDidSaveNotification這個移動器永遠不會到達下一行。

- (id)initWithDocumentName:(NSString *)documentName { 
    self = [super init]; 
    if (self) { 
     self.documentName = documentName; 
     iCloudCommunicator = [ICloudCommunicator sharedInstance]; 
     [iCloudCommunicator registerForICloudAccountChange:self]; 
     if ([iCloudCommunicator useICloud]) { 
      [[NSNotificationCenter defaultCenter] addObserver:self 
                selector:@selector(documentChanged:) 
                 name:NSPersistentStoreDidImportUbiquitousContentChangesNotification 
                 object:self.howRUDocument.managedObjectContext.persistentStoreCoordinator]; 
     } 
    } 
    return self; 
} 

-(void) documentChanged:(NSNotification *)notification { 
    [self.howRUDocument.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

這是我在profiler中看到:

enter image description here

因此,它是一個無限循環(這不就是蘋果地址:-D)。有沒有人知道爲什麼?

另一個奇怪的是,這個方法是在一個類Model中。我有兩個模型從這個類擴展。對於一個合併按預期工作,另一個我得到上述例外。

非常感謝!

回答

0

我解決了這個問題。我在設置文件時有一團糟。當創建並移動到雲時,我正在移動錯誤的文檔網址。 還有一個競爭條件,所以文檔試圖在創建之前打開。

我有這樣的代碼,它工作得很好:

- (id)initWithDocumentName:(NSString *)documentName { 
    self = [super init]; 
    if (self) { 
     _dataChangeListeners = [[NSMutableArray alloc] init]; 
     self.documentName = documentName; 
     iCloudCommunicator = [ICloudCommunicator sharedInstance]; 
     [iCloudCommunicator registerForICloudAccountChange:self]; 
     if ([iCloudCommunicator useICloud]) { 
      [[NSNotificationCenter defaultCenter] addObserver:self 
                selector:@selector(documentChanged:) 
                 name:NSPersistentStoreDidImportUbiquitousContentChangesNotification 
                 object:self.howRUDocument.managedObjectContext.persistentStoreCoordinator]; 
     } 
    } 
    return self; 
} 

-(void) documentChanged:(NSNotification *)notification { 
    [self.howRUDocument.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
    [self notifyDataChangeListeners]; 
}