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