2014-08-29 67 views
1

我對CoreData和RESTful Web服務有疑問。 我閱讀本教程How To Synchronize Core Data with a Web Service – Part 1關於本地CoreData和遠程數據的同步。 我不能因爲方法的理解:使用Web服務同步核心數據

- (void)downloadDataForRegisteredObjects:(BOOL)useUpdatedAtDate 

的信息始終保存之前的JSON文件

(使用方法:[self writeJSONResponse:responseObject toDiskForClassWithName:className];

當所有操作完成則有可能將這些存儲在CoreData上。

這是否有一些基本動機?

爲什麼我們無法直接在CoreData上保存以刪除從讀/寫文件添加的開銷? 謝謝

回答

0

tl; dr保存到磁盤可能是不必要的開銷。

我不能評論作者的動機,但我懷疑這是因爲該應用程序是作爲教程構建的,所以保存到文件是將從Parse.com下載數據的部分和解析JSON的部分分開到CoreData 。

0

在將值應用於託管對象之前,不需要寫出JSON文件(並且,如果您確實將JSON文件寫入到緩存目錄中,則應在完成時將其刪除)。

以下是如何將Web服務響應中的JSON數據應用於核心數據管理對象。

本文使用AFHTTPRequestOperation,所以我們將在這裏使用它。請注意,我假設您有一些方法可以獲取要應用JSON數據的託管對象。通常這將使用find-or-create模式完成。

AFHTTPRequestOperation *operation = [[SDAFParseAPIClient sharedClient] HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     if (json != nil && [json respondsToSelector:@selector(objectForKey:)]){ 
      // Set the JSON values on the managed object, assuming the managed object properties map directly to the JSON keys 
      [managedObject setValuesForKeysWithDictionary:json]; 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Request for class %@ failed with error: %@", className, error); 
    }]; 

我假設SDAFParseAPIClient已經解析了JSON。我們檢查以確保解析的JSON是NSDictionary,然後使用Key Value Coding將其應用於託管對象。

使用NSURLConnection做同樣的事情很簡單,可能是更好的學習體驗。其他基金會聯網方式(NSURLSession等)會的工作幾乎相同的方式:

[NSURLConnection sendAsynchronousRequest:request queue:queue completion:(NSURLResponse *response, NSData *data, NSError *error)] 
    NSIndexSet   *acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; 

    if ([acceptableStatusCodes containsIndex:[(NSHTTPURLResponse *)response statusCode]]){ 
     if ([data length] > 0){ 
      // Parse the JSON 
      id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
      if (json != nil && [json respondsToSelector:@selector(objectForKey:)]){ 
       // Set the JSON values on the managed object, assuming the managed object properties map directly to the JSON keys 
       [managedObject setValuesForKeysWithDictionary:json]; 
      } else { 
       // handle the error 
      } 
     } 
    } else { 
     // Handle the error 
    } 
}]; 

我們發送一個完成塊的異步請求。該塊通過NSHTTPURLResponse,NSDataNSError。首先,我們檢查響應的statusCode是否在200'OK'範圍內。如果不是,或者響應爲零,我們可能已經通過了一個描述原因的NSError。如果響應IS在200範圍內,我們確保NSData在將其交給NSJSONSerialization之前有一些內容。一旦解析了JSON對象,我們確保它響應相關的NSDictionary方法,然後使用鍵值編碼將值應用於管理對象。這假定JSON鍵和值直接映射到託管對象的屬性 - 如果它們不包含,則有許多選項可用於重新映射或變換鍵和值,這些選項甚至超出此問題的範圍。