2015-11-02 92 views
2

如何在不使用對象映射的情況下訪問原始響應json數據。我有以下反應數據。它包含一個nextSyncToken,用於執行查詢和項目集合(在items會話中)。restkit,如何在沒有對象映射的情況下訪問對象

我創建了代表items中內容的Item對象的對象映射。但是,我也需要nextSyncToken字段。我如何在沒有對象映射的情況下訪問它。由於syncToken與對象映射沒有關係。我該如何處理這個問題。

{ 
    "kind": "calendar#events", 
    "nextSyncToken": "COib8eSw78gCEOib8eSw78gCGAU=", 
    "items": [ 
    { 
     "id": "_74rk4cpg84o42b9k8or3gb9k74s34b9p8ks34b9m851kac9m64rk4ci36g", 
     "created": "2010-04-16T11:09:31.000Z", 
     "updated": "2010-04-16T11:10:27.487Z", 
     "summary": "iCal test 1", 
     "start": { 
     "dateTime": "2010-03-16T21:00:00+08:00" 
     }, 
     "end": { 
     "dateTime": "2010-03-16T22:00:00+08:00" 
     } 
    }, 
    { 
     "id": "_752j2h1j6cq4cba68csjeb9k8p33eba1692k4ba284qj8ea688rj2chh6c", 
     "status": "confirmed", 
     "created": "2011-10-18T09:36:02.000Z", 
     "updated": "2011-10-18T09:36:02.000Z", 
     "summary": "New Event", 
     "start": { 
     "dateTime": "2011-10-18T03:45:00+08:00" 
     }, 
     "end": { 
     "dateTime": "2011-10-18T08:15:00+08:00" 
     } 
    } 
    ] 
} 

我的映射代碼:

let eventMapping = RKEntityMapping(forEntityForName: "SGEvent", inManagedObjectStore: managedObjectStore) 

    eventMapping.addAttributeMappingsFromDictionary([ 
     "id":    "identifier", 
     "summary":   "summary", 
     "created":   "createdAt", 
     "updated":   "updatedAt", 
     "location":   "location", 
     "description":  "notes", 
     "start.date":  "allDayStart", 
     "end.date":   "allDayEnd" 
     ]) 

    let startTimeMapping = RKAttributeMapping(fromKeyPath: "start.dateTime", toKeyPath: "startTime") 
    startTimeMapping.valueTransformer = self.googleDateTransformer 
    eventMapping.addPropertyMapping(startTimeMapping) 

    let endTimeMapping = RKAttributeMapping(fromKeyPath: "end.dateTime", toKeyPath: "endTime") 
    endTimeMapping.valueTransformer = self.googleDateTransformer 
    eventMapping.addPropertyMapping(endTimeMapping) 

    eventMapping.identificationAttributes = ["identifier"] 

    let responseDescriptor = RKResponseDescriptor(mapping: eventMapping, method: .GET, 
     pathPattern: "calendars/:calendarId/events", keyPath: "items", 
     statusCodes: RKStatusCodeIndexSetForClass(RKStatusCodeClass.Successful)) 

    objectManager.addResponseDescriptor(responseDescriptor) 

我的請求操作:

objectManager.getObjectsAtPath("calendars/\(identifier)/events", 
     parameters: [self.ACCESS_TOKEN: accessToken], success: { (operation, results) -> Void in 



      callback?(results: nil, error: nil) 
     }) { (_, error) -> Void in 
      print(error) 
    } 

回答

2

一般來說,你會添加其他的響應描述符與適當的映射來處理這個問題。

當使用objectManager.getObjectsAtPath時,假設您有其他一些響應描述符(這會導致調用成功塊),那麼您可以通過瀏覽HTTP操作中的響應數據來獲取原始數據(然後可以解壓縮您的數據認爲合適):

operation.HTTPRequestOperation.responseData 

(或使用responseString代替responseData)。

+0

可以舉個例子。我對RestKit和iOS非常新穎 –

+0

這就是在成功塊中獲取響應數據的所有代碼,然後將它用於JSON序列化程序或類似程序。 – Wain

1
if let dict = try? NSJSONSerialization.JSONObjectWithData(operation.HTTPRequestOperation.responseData, options: .AllowFragments) as? [String: AnyObject], 
     let nextSyncToken = dict?["nextSyncToken"] as? String{ 
    print(nextSyncToken)//get the nextSyncToken 
} 
相關問題