WTFramework 0.1.2

WTFramework 0.1.2

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布最新发布2016年9月

William.Tse维护。



 
依赖:
AFNetworking~> 2.6
FMDB>= 0
 

简介

WTFramework是一个用于iOS的工具框架,它封装了一些常用功能,如序列化、本地数据库、文件缓存、网络、信号等。在此感谢bee框架,给了我许多好的范例和想法。因此,我只是站在巨人的肩膀上。

特性

泛型

虽然xcode支持轻量级泛型,但在反序列化时,我们仍然不能通过它从数组中获取对象类。现在,您可以使用List(ObjectType)而不是 NSArray, 无需属性映射,无需自己循环分析……就像您想要的那么简单。

// TestModel.h
#import "TestItemModel.h"

@interface TestModel : WTModel
@property (nonatomic, strong) List(TestItemModel) *items;
@end


// TestModel.m
#import "TestModel.h"

@implementation TestModel : WTModel
@end


// TestItemModel.h
@interface TestItemModel : WTModel
@property (nonatomic, copy) NSNumber *itemId;
@property (nonatomic, copy) NSString *itemName;
@end
@generic(TestItemModel)


// TestItemModel.m
#import "TestItemModel.h"

@implementation TestItemModel : WTModel
@end
@def_generic(TestItemModel)

然后您可以直接像这样进行序列化和反序列化

NSString *json = @"\
{[\
    {\"itemId\":1, \"itemName\":\"Mac\"},\
    {\"itemId\":2, \"itemName\":\"IPhone\"},\
    {\"itemId\":3, \"itemName\":\"IPad\"}\
]}";

//deserialize from json
TestModel *model = [TestModel objectFromJSONString:json];

//serialize to json
NSString *str = [model toJSONString];

数据库

本地数据库基于FMDB,并支持简单的ORM查询。

// UserModel.h
@interface UserModel : WTModel
@property (nonatomic, copy) NSNumber *userId;
@property (nonatomic, copy) NSNumber *userGender;
@property (nonatomic, copy) NSString *userName;
@end


// UserModel.m
#import "UserModel.h"

@implementation UserModel : WTModel

// define field attributes
WT_DATABASE_FIELD(userId, ((WTDatabaseFieldAttribute){.primaryKey=YES, .autoIncrement=YES}));
WT_DATABASE_FIELD(userGender, ((WTDatabaseFieldAttribute){.index=YES}));

@end

查询和更新数据

[WTDatabaseQueue inDatabase:^(WTDatabase *db){
    //insert or update
    UserModel *model1 = [UserModel model];
    model1.userGender = @1;
    model1.userName = @"LiLei";
    model1.SAVE_INTO(db);

    UserModel *model2 = [UserModel model];
    model2.userGender = @0;
    model2.userName = @"HanMeimei";
    model2.SAVE_INTO(db);

    //query
    UserModel *result = UserModel.DB(db).WHERE(@"userName", @"LiLei").ORDER_ASC_BY(@"userGender")
        .GET_FIRST();

    //delete
    result.DELETE_FROM(db);

    //drop
    UserModel.DB(db).DROP();
}];

此外,您仍然可以使用 "executeScalar", "executeQuery", "executeUpdate" 进行复杂的操作。

缓存

这里提供了文件缓存和内存缓存,您可以缓存任何对象。收到内存警告时,内存缓存数据将自动清除。

UserModel *model = [UserModel model];

//write to file
WTFileCache *fileCache = [WTFileCache sharedInstance];
[fileCache setObject:model forKey:@"user"];

//read from file
NSData *data = [fileCache objectForKey:@"user"];
UserModel *result = [data toObjectWithClass:[UserModel class]];

网络

网络调用直接通过AFNetworking发起,并将查询参数序列化进行组合,您可以传输NSDictionary/WTModel/NSString。在响应者释放之前,请求将被取消。

//global setting 
[WTHttp setBaseUrl:@"http://william-tse.com"];

//parameter
UserModel *model = [UserModel model];
model.userGender = @1;
model.userName = @"LiLei";

//get
[WTHttp get:@"/api/test" parameters:model success:^(id data){

    TestModel *result = [TestModel objectFromDictionary:json];
    //TODO:...

} failure:^BOOL(NSError *err){

    NSLog(@"%@", err);
    return NO;

} responder:viewController];

//post
[WTHttp post:@"http://google.com/api/test" parameters:model success:^(id data){

    TestModel *result = [TestModel objectFromDictionary:json];
    //TODO:...

} failure:^BOOL(NSError *err){

    NSLog(@"%@", err);
    return NO;

} responder:viewController];

信号

当视图控制的某些事件发生时,会触发信号。它可以跨类和跨文件向上传输。您可以根据需要随时转发或停止传播。

ON_SIGNAL3(UIButton, signal)
{
    UIButton *button = signal.target;
    signal.handled = NO;
}

ON_SIGNAL3(UIButton, TouchDown, signal)
{
    UIButton *button = signal.target;
}

WTFramework支持自定义信号。

ON_SIGNAL3(UIButton, TouchDown, signal)
{
    id data = @"The data that you wanted to transmit";

    WTSignal *signal = [WTSignal signalWithName:@"mysignal" target:signal.target object:data];
    [self sendSignal:signal]
}

ON_SIGNAL2(mysignal, signal)
{
    NSString *data = signal.object;
}