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 的描述影響 getObjectsAtPath 的 success or failure。
其他細節只能實際使用才能細細品嚐了。
沒有留言:
張貼留言