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中查找第一个对象
  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/mindyme/p/4948685.html
Copyright © 2011-2022 走看看