2013年12月11日 星期三

Objective-C RestKit 2.0 的介紹與一個簡單範例

 

RestKit 是一個 open source 的 Objective-C 套件,支援 iOS 與 Mac OS X。
https://github.com/RestKit/RestKit


RestKit 幾乎完整包裝了所謂 MVVM 架構中的 VM,只要做些微調整,便可以輕易將 RESTful 的 API 轉換成 Objective-C 中的 Models。跟 Core Data 也進行了高度整合。

RestKit 中,只需要透過 RKObjectMapping,便可以將 API 回來的結果轉換成你所指定的 Model,這是一個簡單的範例,

有一個 Model - User 結構如下

@interface User : NSObject
 
@property (nonatomic, copy) NSNumber *userID;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *screenName;
 
@end
 
 
建立 RKObjectManager 以及 API 的 base URL
NSURL *baseURL = [NSURL URLWithString:@"http://[API HOST]"];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL];
 
 
 
 
透過 RKObjectMapping 建立 API 的 index 與 User 的 property 的對應,例如
RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[User class]];
[userMapping addAttributeMappingsFromDictionary:@{@"id" : @"userID", @"screen_name" : @"screenName", @"name" : @"name"}];
 
 
API 的結構像這樣
[{
    "user": {
        "id": 31337,
        "name": "Blake Watters",
        "screen_name": "Blake Watters"
    }
}]
 
 
 
將 RKObjectMapping 註冊進 RKResponseDescriptor
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:userMapping
    method:RKRequestMethodGET
    pathPattern:@"[API URL pattern]"
    keyPath:nil
    statusCodes:[NSIndexSet indexSetWithIndex:200]
];
 
 
將 RKResponseDescriptor 註冊進 RKObjectManager
[objectManager addResponseDescriptor:responseDescriptor];
 
 
 
接著透過 RKObjectManager 的 getObjectsAtPath 呼叫 API 便可以成功轉換了!
[objectManager getObjectsAtPath:@"[User API URL]" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    // success
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    // failure
}];
 
 
很神奇吧!其中還有許多細節沒有解釋到,例如 HTTP 的 status code 也會因為 RKResponseDescriptor 的描述影響 getObjectsAtPathsuccess or failure
 
其他細節只能實際使用才能細細品嚐了。