2014-02-06 51 views
0

我會盡量保持這個簡短,但基本上,我有一個應用程序,在某種模式下,可以近乎連續地記錄位置和其他數據,並捕捉照片(使用AVFoundation)並將其全部存儲在覈心數據中。正如我懷疑的那樣,我發現所有這些都需要通過線程......否則UI會變得非常緩慢。核心數據多線程 - 我在做什麼錯

我從來沒有試圖將Core Data與併發性結合起來,所以我儘可能地閱讀了它。我覺得我明白自己應該做什麼,但出於某種原因,這是不對的。我碰到這個錯誤:「非法嘗試建立不同上下文中對象之間的關係」managedDataPoint「。我知道這意味着什麼,但我認爲我的下面將會避免這種情況(我正在追蹤我讀過的內容)。 。因爲我從主要上下文中獲取對象ID引用,並使用它來獲取對象的新引用並將其傳遞給「temp」上下文...但這不起作用,因爲Core Data仍聲稱我是在嘗試創建跨環境(在哪裏?)的關係。感謝所有幫助。謝謝!

-(void)snapPhotoForPoint:(ManagedDataPoint*)point 
{ 

if (!_imageCapturer) 
{ 
    _imageCapturer = [[ImageCapturer alloc] init]; 
} 

if (!_tempContext) { 
    _tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    _tempContext.parentContext = self.managedObjectContext; 
} 

__block NSManagedObjectID* pointID = [point objectID]; 

[_tempContext performBlock:^{ 

    NSError *error = nil; 

    Photo *newPhoto = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:_tempContext]; 
    UIImage *image = [_imageCapturer takePhoto]; 
    newPhoto.photoData = UIImageJPEGRepresentation(image, 0.5); 

    ManagedDataPoint *tempPoint = (ManagedDataPoint*)[self.managedObjectContext objectWithID:pointID]; 
    newPhoto.managedDataPoint = tempPoint; // *** This is where I crash 

    if (![_tempContext save:&error]) { // I never get here. 
     DLog(@"*** ERROR saving temp context: %@", error.localizedDescription); 
    } 
}]; 
} 
+0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html –

回答

1

不應該

ManagedDataPoint *tempPoint = (ManagedDataPoint*)[self.managedObjectContext objectWithID:pointID]; 

ManagedDataPoint *tempPoint = (ManagedDataPoint*)[_tempContext objectWithID:pointID]; 

否則,您正在使用不同的上下文!此外,你應該檢查objectID是否是一個臨時ID,如果是,則獲取「final」。

+0

但我需要的對象是在主要上下文中!它傳入方法的頂部。我想也許我只是不正確地理解這一點?如果我需要的對象是在主要上下文中創建並存在的,如何從我的「temp」上下文中檢索?我不認爲它會在那裏,除非我已經保存,並從主要推動到臨時......我試圖以另一種方式(從臨時到主要)。 –

+0

您正在使用objectID並從_tempContext獲取點對象,以便您可以在相同的上下文中建立關係。正如你自己描述的那樣,並且正如它所記錄的那樣。 – Volker

+0

呃...我給了它一個旋風,我至少不會崩潰了。不知道它是否「正常」,因爲我沒有測試過。非常感謝這些信息......儘管如此,我還是很難理解。如果我在一個上下文中使用對象ID作爲對象,然後使用該ID查詢另一個上下文,並且該對象不存在於第二個上下文中,那麼它是否會出錯併爲我創建一個,因爲這兩個上下文共享一個持久性商店? –