zoukankan      html  css  js  c++  java
  • Magical Record设计小谈

    一、多线程设计

    基本是按照我的这篇文章中的第二种方案。MR提供的与每个线程绑定的ctx都是以default context为parent context的, 从而实现子线程的操作可以同步到主线程中去

    二、MR中维护的MOC结构

    为了方便说明,以下内容中采用简称:RSC = root saving context, DC = default context

    1. RSC为NSPrivateQueueConcurrencyType类型的context, 其parent store为PSC,不与任何线程绑定。
    2. DC 为NSMainQueueConcurrencyType类型的context, 其parent context为RSC, 与主线程绑定。
    3. MR为每一个线程绑定了一个NSPrivateQueueConcurrencyType类型的context, 以MagicalRecord_NSManagedObjectContextForThreadKey为key, ctx为value, 存储在线程的threadDictionary中。 该context以DC为parent context.
    4. 调用"+MR_context"方法,获取一个新的,以RSC(而非DC)为parent context的PrivateQueueConcurrency类型的ctx。

    三、MR中MOC之间的同步

    1. DC和RSC之间的同步
      NSManagedObjectContext类会监听RSC抛出的NSManagedObjectContextDidSaveNotification。 当RSC完成save操作后, DC会mergeChanges进行同步。而DC以RSC为 parent context, DC做保存操作之后, 变化会自动同步到RSC中
    2. DC和子线程绑定的context的同步
      由于子线程绑定的context以DC为parent context,因此子线程context做保存操作之后,变化会自动同步到DC中。 如果子线程绑定的context需要同步DC中的变化,则需要采用下面的第三种方式
    3. 主动同步:MR在MagicalObjectContext的"MagicalObserving" category中提供了接口用来做ctx之间的同步。内部的机制是通过监听NSManagedObjectContextDidSaveNotification通知。

    四、MR的使用

    1. 一键setup , 初始化各个类的default变量值
      [MagicalRecord setupCoreDataStack];
    2. 执行后台任务
      直接使用MagicalRecord类提供的+ saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block方法即可。block里的操作应该使用传入的参数localContext。该localContext以RSC为parent ctx, 而不是DC。
    3. context的保存
      MR提供了context的多种保存方式,包括指定同步还是异步,仅保存当前context还是一直保存到persistent store中。
    4. Active Record Pattern体现在NSManagedObject的一系列category方法中。比如:
      1. 增加一个对象:

        1. +MR_createEntity: 在当前线程绑定的ctx中增加
        2. +MR_createEntityInContext: 在传入的ctx中增加
      2. 删除一个对象:

        1. -MR_deleteEntity: 在receiver所属的ctx中把receiver删除
        2. -MR_deleteEntityInContext: 在传入的ctx中把与receiver对应的object删除
      3. 清空一张表:

        1. +MR_truncateAll: 在当前线程绑定的ctx中清空这张表
        2. +MR_truncateAllInContext: 在传入的ctx中清空这张表
      4. 查找:
        体现在NSManagedObject的MagicalRequestMagicalAggregationMagicalFinders三个categories中。譬如,

        1. MR_findFirstInContext: 在传入的ctx中查找第一个对象
  • 相关阅读:
    android studio中timber的配置
    bufferknife框架的正确使用方式 -终于他么知道了
    开源的图像滤镜库----for Android
    HSV做通道分离是出现的Vector内存越界错误
    HSV与RGB的相互转换的公式
    Windows下python的第三方库的安装
    Python出现"Non-ASCII character 'xe6' in file"错误解决方法
    Verilog的IDE Quartus II
    Java-ZipUtil工具类
    Java-JDBCUtil工具类
  • 原文地址:https://www.cnblogs.com/mindyme/p/4948685.html
Copyright © 2011-2022 走看看