Realm-JSON, 使用领域和JSON的简洁的地幔

分享于 

7分钟阅读

GitHub

  繁體 雙語
A concise Mantle-like way of working with Realm and JSON.
  • 源代码名称:Realm-JSON
  • 源代码网址:http://www.github.com/matthewcheok/Realm-JSON
  • Realm-JSON源代码文档
  • Realm-JSON源代码下载
  • Git URL:
    git://www.github.com/matthewcheok/Realm-JSON.git
    Git Clone代码到本地:
    git clone http://www.github.com/matthewcheok/Realm-JSON
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/matthewcheok/Realm-JSON
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Realm+JSON License MIT

    Badge w/VersionBadge w/Platform

    一种简洁的地幔使用领域和JSON的方法。

    更改

    • 方法 - deepCopy 替换了 - shallowCopy 以前的功能,它不再维护对象键的一个主
    • 更新为使用领域 0.85.0中的原生主键支持
    • 更新代码以使用方法 -createOrUpdateInRealm:withJSONArray: 或者 -createOrUpdateInRealm:withJSONDictionary:
    • 必须将这些方法包装在写事务中( [realm beginWriteTransaction];[realm commitWriteTransaction]; 之间)
    • 这些方法调用场景后面的-createOrUpdateInRealm:withObject: 以获得性能。

    安装

    将以下内容添加到 CocoaPods Podfile

    
    pod 'Realm+JSON', '~> 0.2'
    
    
    
    

    或者克隆成一个git子模块

    或者只是将 Realm+JSON 文件夹中的文件复制到你的项目中。

    使用 Realm+JSON

    简单地声明你的模型为正常模式:

    
    typedef NS_ENUM(NSInteger, MCEpisodeType) {
    
    
     MCEpisodeTypeFree = 0,
    
    
     MCEpisodeTypePaid
    
    
    };
    
    
    
    @interface MCEpisode : RLMObject
    
    
    
    @property NSInteger episodeID;
    
    
    @property NSInteger episodeNumber;
    
    
    @property MCEpisodeType episodeType;
    
    
    
    @property NSString *title;
    
    
    @property NSString *subtitle;
    
    
    @property NSString *thumbnailURL;
    
    
    
    @property NSDate *publishedDate;
    
    
    
    @end
    
    
    
    RLM_ARRAY_TYPE(MCEpisode)
    
    
    
    

    然后传递 NSJSONSerialization 或者 AFNetworking的结果,如下所示:

    
     [MCEpisode createOrUpdateInRealm:[RLMRealm defaultRealm] withJSONArray:array];
    
    
    
    

    或者

    
     [MCEpisode createOrUpdateInRealm:[RLMRealm defaultRealm] withJSONDictionary:dictionary];
    
    
    
    

    使用 -JSONDictionary 方法为你的网络请求获取一个json就绪词典。

    配置

    你应该在 RLMObject 子类上指定入站和出站JSON映射,如下所示:

    
    + (NSDictionary *)JSONInboundMappingDictionary {
    
    
     return @{
    
    
     @"episode.title": @"title",
    
    
     @"episode.description": @"subtitle",
    
    
     @"episode.id": @"episodeID",
    
    
     @"episode.episode_number": @"episodeNumber",
    
    
     @"episode.episode_type": @"episodeType",
    
    
     @"episode.thumbnail_url": @"thumbnailURL",
    
    
     @"episode.published_at": @"publishedDate",
    
    
     };
    
    
    }
    
    
    
    + (NSDictionary *)JSONOutboundMappingDictionary {
    
    
     return @{
    
    
     @"title": @"title",
    
    
     @"subtitle": @"episode.description",
    
    
     @"episodeID": @"id",
    
    
     @"episodeNumber": @"episode.number",
    
    
     @"publishedDate": @"published_at",
    
    
     };
    
    
    }
    
    
    
    

    可以通过实现 jsonPreprocessing: static 方法来完成JSON预处理:

    - (NSDictionary *)jsonPreprocessing:(NSDictionary *)dictionary {
     NSMutableDictionary *dict = [[NSMutableDictionaryalloc] initWithDictionary:dictionary];
     dict[@"releaseCount"] = @(0);
     return dict.copy;
    }

    出现上述任一一项将导致映射映射到映射到camelCase等效的snake_case的属性的映射。

    可以使用Mantle来为属性指定 NSValueTransformers:

    
    + (NSValueTransformer *)episodeTypeJSONTransformer {
    
    
     return [MCJSONValueTransformer valueTransformerWithMappingDictionary:@{
    
    
     @"free": @(MCEpisodeTypeFree),
    
    
     @"paid": @(MCEpisodeTypePaid)
    
    
     }];
    
    
    }
    
    
    
    

    处理后台线程

    领域要求在跨不同线程工作时使用不同的RLMRealm 对象。 这意味着不应该从不同的线程访问相同的RLMObject 实例。 为了使这一点更容易使用,使用 - primaryKeyValue 从实例中检索包装的主 key-value 并以后使用它查询。 + objectInRealm:withPrimaryKeyValue:

    
    id primaryKeyValue = [episode primaryKeyValue];
    
    
    dispatch_async(dispatch_get_main_queue(), ^{
    
    
     MCEpisode *episode = [MCEpisode objectInRealm:[RLMRealm defaultRealm] withPrimaryKeyValue:primaryKeyValue];
    
    
    
    //do something with episode here
    
    
    });
    
    
    
    

    使用( 临时) 副本( RLMObject+Copying )

    如果需要显示可以能或者不能更改对象属性的UI,有时使用不作为后备模型对象的对象。 在提交更改时,可以将属性复制回存储模型。

    方法 - shallowCopy- mergePropertiesFromObject: 提供。 以后需要在领域事务中执行。

    
    #import <Realm+Copying.h>
    
    
    
    MCEpisode *anotherEpisode = [episode shallowCopy];
    
    
    anotherEpisode.title = @"New title";
    
    
    
    //...
    
    
    
    [episode performInTransaction:^{
    
    
     [episode mergePropertiesFromObject:anotherEpisode];
    
    
    }];
    
    
    
    

    此外,还提供了方法 - deepCopy- shallowCopy 不同,它维护对象键的主。

    许可证

    Realm+JSON在MIT许可证下。


    MAN  LIKE  Realm  mantle  
    相关文章