测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
发布上次发布 | 2014年12月 |
由 Anders Carlsson 维护。
依赖 | |
AFNetworking | ~> 1.0 |
EGOCache | ~> 2.0 |
Flaming June 是一个简单的模型超类,用于通过与 AFNetworking 进行交互来使用 REST 服务。它还具有内置的对象身份映射(如果对象有唯一的 ID)。身份映射中的缓存对象可以持久化到磁盘作为离线缓存。
它通过任何 AFHTTPClient
的子类访问 REST 服务。
Flaming June 使用 CocoaPods 进行依赖管理。
让您的模型继承自 OEGModel
,如下所示
#import "OEGModel.h"
@class AppDotNetUser;
@interface AppDotNetPost : OEGModel
@property (nonatomic, strong) NSDate *createdAt;
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) AppDotNetUser *user;
+ (void)globalTimeline:(OEGCallbackBlock)block;
#import <AFNetworking.h>
#import "AppDotNetPost.h"
#import "AFAppDotNetAPIClient.h"
#import "OEGModel+Private.h"
@implementation AppDotNetPost
+ (NSDictionary *)propertyMapping {
return @{
@"createdAt" : @"created_at",
@"text": @"text",
@"user": @"user"
};
}
+ (NSString *)arrayRootKey {
return @"data";
}
+ (AFHTTPClient *)httpClient {
return [AFAppDotNetAPIClient sharedClient];
}
#pragma mark - Finding posts
+ (void)globalTimeline:(OEGCallbackBlock)block {
[self requestMethod:@"get" path:@"stream/0/posts/stream/global" params:nil inBackground:block];
}
@end
globalTimeline:
方法将通过一个包含 AppDotNetPost
对象的 NSArray
或一个错误情况下的 NSError
来调用回调块。
使用 arrayRootKey
方法是因为 App.net API 将响应数组包装在一个具有键 data
的 JSON 对象中。如果响应被包装在具有某个键的 JSON 对象中(当获取单个资源时),请在 dictionaryRootKey
回调中指定此键。
建议您的模型声明一些公共方法来获取或更新特定数据,然后这些方法再使用内部的 requestMethod:path:params:inBackground:
方法。为了获得更多灵活性,还有一个方法 requestMethod:path:params:inBackground:options:
。选项参数是一个具有以下可能键的 NSDictionary
OEGFlamingJuneRawCallbackKey
:一个类型为 OEGRawCallbackBlock
的回调块,它使用原始 AFNetworking 响应参数(在数据映射到 OEGModel 对象之前)被调用。传递给块的参数列表是:AFHTTPRequestOperation *operation, id responseData, NSError *error
。OEGFlamingJuneForceCacheKey
:如果将其设置为 @YES
,则无论缓存头如何,HTTP 响应都将被缓存。如果存在之前缓存的 数据,则回调块将被调用两次,第一次调用带有缓存数据,第二次调用在请求完成时带上新鲜数据。数据缓存在磁盘上。因为 user
属性被定义为 AppDotNetUser
,后者同时也是 OEGModel
的子类,所以它将使用该类的 propertyMapping
来填充。如果多个帖子共享同一个用户(相同的 ID),它们将关联到相同的内存对象。
如果一个定义为 OEGModel
子类的属性在响应 JSON 中有一个非字典值,则假定该值是对象的 ID。如果对象先前通过某个早期的请求加载,它将正确关联。
从AFNetworking示例项目借用了AFAppDotNetAPIClient
类。任何AFHTTPClient
子类都可以。
任何属性都可以有一个相关的NSValueTransformer,用于在web服务响应中将值转换到属性。例如,属性声明为NSURL
,但服务返回的值解释为字符串时非常有用。
要为属性附加NSValueTranformer
,只需在其OEGModel
子类上实现一个方法- (NSValueTransformer *)<propertyName>Transformer
。要创建新的NSValueTransformers,可以查看TransformerKit。
一些属性转换会自动处理
NSDate
,则默认假设映射的响应值是一个标准JSON日期格式的字符串,如果没有定义特殊的转换器。NSArray
、NSSet
或任何子类(例如NSMutableArray
),并且从服务返回的值是常规数组,它将被自动转换。NSNumber
包装的对应值转换。如果你的模型有一个NSArray
或NSSet
属性,并且web服务响应的是一个数组,它应由OEGModel
对象解释,Flaming June提供了一个特殊的NSValueTransformer
子类,称为OEGAssociationTransformer
。
假设你有一个名为children
的OEGModel
子类属性,其类型为NSArray
。该属性应使用具有类ChildObject
的对象数组进行初始化,web服务响应的是表示这些对象的一批字典,实现此行为如下
- (NSValueTransformer *)childrenTransformer {
return [OEGAssociationTransformer associationTransformerForModelClass:[ChildObject class]];
}
web服务还可以响应一个数字ID数组,并且只要在初始化时在对象存储库中存储了对象,children
数组将使用正确的ChildObject
对象初始化。
对象的本地缓存由OEGObjectRepository
处理。此类提供了一些用于持久化和加载对象以进行离线缓存的方法。例如,要保存对象存储库,当应用程序关闭时调用
[[OEGObjectRepository sharedRepository] saveToCache];
要再次加载它,当应用程序启动时
[[OEGObjectRepository sharedRepository] loadCached];
还有一个- (void)clean
方法来清空对象存储库,和一个- (NSUInteger)count
方法来计算其中的对象数量。
要运行测试,需要NSURLConnectionVCR和TransformerKit。它们作为CocoaPod依赖项包含在内。
Flaming June是弗雷德里克·莱顿爵士的一幅静物画。它也符合AFNetworking的火焰主题。