2013-07-06 14 views
0

我正在使用RestKit應用程序的後端。 一切工作正常,但我遇到一個問題,提取本地刪除後未改變的數據。RestKit數據同步後本地刪除問題

這是路徑匹配:

[self.objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) { 
    RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"cards"]; 
    if([pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:nil]) 
     return [NSFetchRequest fetchRequestWithEntityName:@"Card"]; 
    return nil; 
    }]; 

當API響應缺少本地對象中的一個缺失被適當地傳播。

然而,當局部缺失等來進行:

for(NSManagedObject *entity in cards) { 
    [RKManagedObjectStore.defaultStore.mainQueueManagedObjectContext deleteObject:card]; 

如果請求再次執行/卡取出,不會更新卡如果只是在CoreData刪除的對象沒有改變。在應用重新啓動或者API響應中包含新對象之前,情況仍然如此。

的RKMappingResult是空的,即使服務器返回正確的JSON:

2013-07-03 17:58:00.732 Thanx[76837:c07] I restkit.network:RKHTTPRequestOperation.m:185 GET 'http://api.thanx-web.dev/v2/cards' (200 OK) [0.1086 s] 
    2013-07-03 17:58:00.734 Thanx[76837:c07] <RKMappingResult: 0xac9b080, results={ 
     "<null>" =  (
    ); 
    }> 
    2013-07-03 17:58:00.734 Thanx[76837:c07] <RKManagedObjectRequestOperation: 0xbb32250, state: Successful, isCancelled=NO, request: <NSMutableURLRequest http://api.thanx-web.dev/v2/cards>, response: <NSHTTPURLResponse: 0xbb42060 statusCode=200 MIMEType=application/json length=201>> 

有什麼我能做些什麼來解決這個問題?這似乎是某種緩存問題。但是,即使在本地刪除後立即運行[RKManagedObjectStore.defaultStore resetPersistentStores:nil]函數似乎也無法解決此問題。

感謝您的幫助,

達倫

編輯 - 這裏是適用的模型映射:

RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Card" inManagedObjectStore:self.objectManager.managedObjectStore]; 
// enable validations 
mapping.performKeyValueValidation = YES; 
// if validation fails, skip object rather than entire request 
mapping.discardsInvalidObjectsOnInsert = YES; 
// add json-to-model mappings 
[mapping addAttributeMappingsFromArray:@"card_id", @"last4", @"name"]; 

識別屬性默認爲card_id,所以它不是手動指定。

謝謝!

+0

您在映射中指定了哪些標識屬性?請顯示您的所有映射。 – Wain

+0

@Wain - 謝謝你的回覆。我用卡的映射更新了問題。沒有指定標識屬性,但RestKit默認使用'card_id'。這會成爲一個問題嗎? –

+0

@Wain - 我測試了它並手動設置了'card_id' - 沒有運氣。有任何想法嗎? –

回答

0

實際上,您必須從持久存儲中獲取數據,而不是當前創建的託管上下文。我的意思是[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyModel"]; 
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:NO]; 
fetchRequest.sortDescriptors = @[descriptor]; 

// Setup fetched results 
NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                     managedObjectContext:[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext 
                      sectionNameKeyPath:nil 
                        cacheName:nil]; 

// AND TO DELETE A MODEL : 

[[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext deleteObject:myobject]; 
+0

我認爲它更可能是一個身份緩存問題,因爲正在觀察用於刪除的MOC並且更改被傳播。 – Wain

+0

@龍克利 - 我不相信這是真的。這與文件記錄不符。 http://restkit.org/api/latest/Classes/RKManagedObjectStore.html#//api/name/mainQueueManagedObjectContext「主隊列上下文可供主隊列使用以驅動用戶界面需求。上下文使用NSMainQueueConcurrencyType可以直接從主線程發送消息,上下文是persistentStoreManagedObjectContext的子上下文,並且可以通過保存將更改保存到父進程中。 –

+0

嗯,這可能是真的,因爲這是@blakewaters建議在這種情況下嘗試的。你嘗試過嗎? – Lonkly