OEGFlamingJune 0.0.1

OEGFlamingJune 0.0.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

Anders Carlsson 维护。



 
依赖
AFNetworking~> 1.0
EGOCache~> 2.0
 

  • Anders Carlsson

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日期格式的字符串,如果没有定义特殊的转换器。
  • 如果属性定义为NSArrayNSSet或任何子类(例如NSMutableArray),并且从服务返回的值是常规数组,它将被自动转换。
  • 如果属性是原始类型,如BOOL或int,由于底层实现使用键值编码,因此值将自动从其NSNumber包装的对应值转换。

关联

如果你的模型有一个NSArrayNSSet属性,并且web服务响应的是一个数组,它应由OEGModel对象解释,Flaming June提供了一个特殊的NSValueTransformer子类,称为OEGAssociationTransformer

假设你有一个名为childrenOEGModel子类属性,其类型为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方法来计算其中的对象数量。

测试

要运行测试,需要NSURLConnectionVCRTransformerKit。它们作为CocoaPod依赖项包含在内。

名称

Flaming June是弗雷德里克·莱顿爵士的一幅静物画。它也符合AFNetworking的火焰主题。