2014-01-14 18 views
0

我試圖實現一個NSIncrementalStore,它將通過RPC API訪問服務器。它需要在本地緩存所有數據,所以我已經開始創建一個NSIncrementalStore來使用另一個用作緩存的核心數據棧。NSIncrementalStore:對象的持久性存儲無法從此NSManagedObjectContext的協調器中獲得

因此,首先設置元數據並設置緩存將使用的核心數據堆棧。緩存SQL文件是當商店被初始化傳入的URL:

- (BOOL)loadMetadata:(NSError *__autoreleasing *)error { 

NSMutableDictionary *mutableMetadata = [NSMutableDictionary dictionary]; 
[mutableMetadata setValue:[[NSProcessInfo processInfo] globallyUniqueString] forKey:NSStoreUUIDKey]; 
[mutableMetadata setValue:RTkCachedAPIStoreType forKey:NSStoreTypeKey]; 
//[mutableMetadata setValue:NSStringFromClass([self class]) forKey:NSStoreTypeKey]; 
[self setMetadata:mutableMetadata]; 

// Set up the Cache Stack 
NSManagedObjectModel *model = [self.persistentStoreCoordinator.managedObjectModel copy]; 
self.cacheModel = model; 

self.cachePersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.cacheModel]; 

self.cacheContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

NSURL *storeURL; 
if ([self.URL isFileURL]) { 
    storeURL = self.URL; 
} 

NSError *storeAddError = nil; 
if (![self.cachePersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                 configuration:nil 
                    URL:storeURL 
                   options:nil 
                   error:&storeAddError]) { 
    NSLog(@"Fatal error while creating persistent store: %@", storeAddError); 
    abort(); 
} 

[self.cacheContext setPersistentStoreCoordinator:self.cachePersistentStoreCoordinator]; 

return YES; 
} 

爲實體看起來像下面的代碼的簡單請求的執行請求。本質上,我只是接受請求,將其封裝爲FetchRequest並在Cache Core數據棧上執行請求。我然後再使用返回的objectID對調用上下文創建對象:

- (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError *__autoreleasing *)error { 

if ([request requestType] == NSFetchRequestType) { 
    NSFetchRequest *fetchRequest = (NSFetchRequest *)request; 
    NSEntityDescription *entity = [fetchRequest entity]; 

    NSFetchRequest *cacheFetchRequest = [[NSFetchRequest alloc] init]; 
    cacheFetchRequest.entity = entity; 
    __block NSArray *fetchedObjectFromCache; 
    [self.cacheContext performBlockAndWait:^(){ 
     fetchedObjectFromCache = [self.cacheContext executeFetchRequest:cacheFetchRequest error:error]; 
    }]; 
    NSMutableArray *fetchedObjects = [NSMutableArray arrayWithCapacity:[fetchedObjectFromCache count]]; 
    for (NSManagedObject *anObject in fetchedObjectFromCache) { 
     NSManagedObjectID *objectID = anObject.objectID; 
     NSManagedObject *managedObject = [context objectWithID:objectID]; 
     [fetchedObjects addObject:managedObject]; 
    } 
    return fetchedObjects; 
} 
} 

當我嘗試了這一點,它拋出在該行有錯誤

<unknown>:0: error: -[] : Object's persistent store is not reachable from this NSManagedObjectContext's coordinator

異常NSManagedObject *managedObject = [context objectWithID:objectID];我不能弄清楚爲什麼這是 - 這是蘋果建議這是在文檔中完成的確切方式!

此錯誤似乎與跨線程訪問上下文有關 - 但我沒有這樣做。 關於這裏有什麼問題的任何建議?

回答

3

您正在使用錯誤的objectID。

緩存中的objectID與您持久存儲的objectID不匹配,因爲您的增量存儲沒有相同的標識。

+0

謝謝!這就是問題所在,盯着我! – SimonB

+0

:)不客氣! – ImHuntingWabbits

相關問題