Objective-C 网络抽象,有助于使在 iOS 应用中设置服务层更加快速和简单
在该仓库的 /Example/JFTransporterExample 目录下有一个完整的示例项目。我强烈建议您克隆并打开这个示例项目,它展示了如何使用 JFTransporter
。
创建您的模型类,并确保它们遵循 JFTransportable
协议。
#import <JFTransporter/JFTransportable.h>
@interface Forecast : NSObject <JFTransportable>
// Forecast model properties
@property (nonatomic) double latitude;
@property (nonatomic) double longitude;
@property (nonatomic, strong) Current* current;
@property (nonatomic, strong) Daily* daily;
// JFTransportable Required Properties
@property (nonatomic, strong) NSURL* URL;
@property (nonatomic, strong) NSString* HTTPMethod;
@property (nonatomic, strong) NSData* HTTPBody;
@property (nonatomic, strong) NSDictionary* HTTPHeaderFields;
- (id)initWithWithLatitude:(double)latitude andLongitude:(double)longitude NS_DESIGNATED_INITIALIZER;
@end
在您的模型实现中,实现任何适合您模型的可选 JFTransportable
方法。例如,如果您的模型只从 API 的 GET 请求创建,那么您只需实现 - (NSURL*)GETURL
方法。但是,如果您的模型还需要 POST、DELETE 等,您还需要实现相应的 JFTransportable
方法。
在每个方法实现中,您需要返回用于相应 HTTP 请求的完整、完整的 URL。请参阅下面的示例。
#import "Forecast.h"
static NSString* const kForecastAPIURLString = @"https://api.forecast.io/forecast/018524e6ba1870dc2c7356d98d9b9b40";
@implementation Forecast
...
- (NSURL*)GETURL
{
NSURL* URL = [NSURL URLWithString:kForecastAPIURLString];
URL = [URL URLByAppendingPathComponent:[NSString stringWithFormat:@"%f,%f", self.latitude, self.longitude]];
return URL;
}
...
从 JFTransportable
协议中实现 - (NSDictionary*)responseToObjectModelMapping
方法。这用于告诉 JFTransporter
如何将 API 的响应对象 KVP 映射到您的模型。
有两个辅助宏,您可以使用它们告诉 JFTransporter
如何将响应子字典/数组映射到特定的模型类/集合。这两个宏是 JFObjectModelMappingObjectDictionary(_CLASS_, _PROPERTY_)
和 JFObjectModelMappingObjectArray(_CLASS_, _PROPERTY_)
。两者都接受一个 Class 作为第一个参数,一个代表模型属性的 NSString 用于将该 Class 实例映射到。请参阅下面的示例。
#import "Forecast.h"
@implementation Forecast
...
- (NSDictionary*)responseToObjectModelMapping
{
return @{@"currently": JFObjectModelMappingObjectDictionary([Current class], @"current"),
@"daily": JFObjectModelMappingObjectDictionary([Daily class], @"daily")};
}
...
以下是一个使用 JFObjectModelMappingObjectArray
宏的 Daily
模型的例子。
#import <JFTransporter/JFTransportable.h>
@interface Daily : NSObject <JFTransportable>
@property (nonatomic, strong) NSArray/*<Day>*/* days;
// JFTransportable Required Properties
@property (nonatomic, strong) NSURL* URL;
@property (nonatomic, strong) NSString* HTTPMethod;
@property (nonatomic, strong) NSData* HTTPBody;
@property (nonatomic, strong) NSDictionary* HTTPHeaderFields;
@end
#import "Daily.h"
#import "Day.h"
@implementation Daily
- (NSDictionary*)responseToObjectModelMapping
{
return @{@"data": JFObjectModelMappingObjectArray([Day class], @"days")};
}
@end
创建您模型的一个实例,并将其传递到相应的 JFTransporter
请求方法。然后,JSTransporter
将根据您模型通过 JFTransportable
协议实现告知的信息创建并执行一个 HTTP 请求。之后,它将使用您在每个模型中实现的对象映射 NSDictionaries 映射响应。结果就是您新创建的模型的所有属性都将自动正确设置,并在完成块中返回给您。以下是一个示例。
@interface ViewController ()
@property (nonatomic, strong) Forecast* forecast;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Forecast* forecast = [[Forecast alloc] initWithWithLatitude:33.7550 andLongitude:-84.3900];
[[JFTransporter defaultTransporter] GETTransportable:forecast withCompletionHandler:^(id<JFTransportable> transportable, NSError *error) {
if (transportable && !error) {
self.forecast = transportable;
[self.tableView reloadData];
}
}];
}
// Other code to fill tableView with forecast data goes here
版权(c)2012 Jeremy Fox (jeremyfox.me)。保留所有权利。
特此准许,任何获得此软件及其相关文档文件(“软件”)副本的个人(“使用者”),无需支付任何费用就可以自由处置软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并准许任何接收到软件的个人可以这样做,但前提是遵守以下条件
以上版权声明和本许可声明应包含在软件的任何副本或实质性部分中。
该软件按“现时供应”提供,不提供任何保证,无论是明示的还是暗示的,包括但不限于适销性、针对特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者不应对因任何行为、侵权或其它任何方式引起的任何索赔、损害或其它责任负责,这些行为、侵权或其它任何方式起因于、产生于或与软件本身或软件的使用或其它交易有关。