尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

不落库的临时模型:Realm+JSON shallowCopy、deepCopy 与 mergePropertiesFromObject 完整教程

不落库的临时模型:Realm+JSON shallowCopy、deepCopy 与 mergePropertiesFromObject 完整教程 不落库的临时模型RealmJSON shallowCopy、deepCopy 与 mergePropertiesFromObject 完整教程【免费下载链接】Realm-JSONA concise Mantle-like way of working with Realm and JSON.项目地址: https://gitcode.com/gh_mirrors/re/Realm-JSONRealmJSON是一个简洁的、Mantle 风格的 Realm 与 JSON 互转工具库。实际开发中我们常需要不落库的临时模型——一种脱离 Realm 数据库、可以随意修改、不写盘的对象副本。本教程面向新手完整讲解 RealmJSON 提供的三个核心 APIshallowCopy、deepCopy 与 mergePropertiesFromObject从用法、原理、对比到避坑帮你彻底掌握 Realm 临时模型的正确姿势。为什么需要不落库的临时模型Realm 中的持久化对象和数据库强绑定直接修改它们时每次改动都必须包在写事务里事务一提交修改立刻写入磁盘想保存前反悔没有原生的草稿机制。于是临时模型应运而生先把数据复制成一份不属于任何 Realm 的对象随便改、随便丢确认无误后再一次性合并回数据库。这正是RLMObjectCopying分类要解决的问题。三个核心 API 速览 API作用方向是否落库典型用途shallowCopy复制对象❌ 不落库创建可编辑的草稿副本deepCopy深度复制❌ 不落库完整快照、撤销恢复mergePropertiesFromObject:合并回写✅ 需在事务中把草稿修改提交回数据库三个方法都声明在 RLMObjectCopying.h 中属于RLMObject分类扩展任何模型类开箱即用。shallowCopy 使用方法三步创建可编辑草稿 ✂️shallowCopy会创建一个同类的新实例并把当前对象的全部属性复制过去得到一份完全脱离 Realm 的副本。它的实现很轻巧见 RLMObjectCopying.m 第 22-27 行先alloc一个新实例再调用mergePropertiesFromObject:完成属性拷贝。典型用法#import RLMObjectCopying.h // 从库里取出已持久化的对象 MCEpisode *episode [MCEpisode objectInRealm:[RLMRealm defaultRealm] withPrimaryKeyValue:(42)]; // 创建不落库的草稿随意修改 MCEpisode *draft [episode shallowCopy]; draft.title 一个还没想好的新标题; draft.subtitle 改了又改反正不影响数据库;此时draft和数据库毫无关系你怎么折腾它都不会触发 Realm 的写事务非常适合做编辑表单的草稿模型。deepCopy 使用指南深度复制嵌套对象的正确姿势 shallowCopy只拷贝当前对象的一层属性遇到**嵌套对象RLMObject和集合RLMArray**时怎么办这时要用deepCopy。查看 RLMObjectCopying.m 第 66-91 行的实现deepCopy会遍历所有属性并分类处理数组属性RLMPropertyTypeArray对每个元素递归调用deepCopy再逐个加入新数组对象属性RLMPropertyTypeObject对关联对象递归deepCopy后赋值普通属性直接拷贝值。这意味着嵌套多层的关系模型也能被完整地克隆出来MCEpisode *snapshot [episode deepCopy]; // snapshot 与 episode 完全同构但互不影响且不落库同时deepCopy会完整保留对象的主键README 中也明确这一点适合做修改前的完整快照出问题时随时回滚。mergePropertiesFromObject 合并技巧把临时修改安全写回 Realm 草稿改完了如何提交mergePropertiesFromObject:负责把来源对象的属性合并写回自身实现细节见 RLMObjectCopying.m 第 29-63 行普通属性直接用来源值覆盖主键属性两侧主键一致时不会重复写入保护对象的身份标识数组属性采用addObjects:追加合并而不是整体替换。由于目标对象通常已绑定 Realm合并必须在写事务中执行。项目贴心地提供了performInTransaction:帮手方法见 RLMObjectJSON.m 第 141-149 行对象已绑定 Realm 时自动开启事务否则直接执行。#import RLMObjectJSON.h // 确认草稿无误后在事务中合并回持久化对象 [episode performInTransaction:^{ [episode mergePropertiesFromObject:draft]; }];三者怎么选一张决策清单 ✅只需要一层数据、可编辑草稿→shallowCopy需要嵌套对象/数组的完整快照→deepCopy想把草稿改动写回数据库→mergePropertiesFromObject:配合事务只想读取数据不想写库→ 直接查询根本不需要复制Realm 临时模型实战从 JSON 到草稿再到提交 把前面所有知识点串起来就是一套完整的拉取 JSON → 建草稿 → 提交修改流程。以 Demo 中的MCEpisode模型见 MCEpisode.m主键为episodeID为例第 1 步拉取 JSON 并落库。参照 MCTableViewController.m 第 29-45 行的写法用 AFNetworking 请求数据后在写事务中批量入库[realm beginWriteTransaction]; [MCEpisode createOrUpdateInRealm:realm withJSONArray:array]; [realm commitWriteTransaction];第 2 步取出对象建草稿。MCEpisode *draft [episode shallowCopy]; draft.title 新标题;第 3 步确认后合并提交。[episode performInTransaction:^{ [episode mergePropertiesFromObject:draft]; }];三步走完草稿的修改才真正写盘。中间任何一步想放弃丢掉draft即可数据库毫发无伤。新手最容易踩的 4 个坑 ⚠️忘记写事务mergePropertiesFromObject:写入已绑定的 Realm 对象时务必包在事务里否则会抛异常建议统一用performInTransaction:包装。跨线程访问对象Realm 对象不能跨线程直接使用复制出来的临时对象则可以。跨线程传值用primaryKeyValue配合objectInRealm:withPrimaryKeyValue:重新查询见 RLMObjectJSON.m 第 83-103 行。误解数组合并行为mergePropertiesFromObject:对数组是追加而不是替换重复合并可能导致元素翻倍注意去重逻辑。分不清浅拷贝与深拷贝模型里有嵌套关系时用shallowCopy只会拷贝一层引用需要完整快照务必用deepCopy。相关源码在哪里看复制 API 声明RLMObjectCopying.h复制 API 实现RLMObjectCopying.mJSON 互转与事务帮手RLMObjectJSON.h、RLMObjectJSON.m临时副本官方说明README 中 Working with (temporary) copies (RLMObjectCopying) 一节完整示例模型MCEpisode.m网络拉取落库示例MCTableViewController.m总结RealmJSON 的 shallowCopy、deepCopy 与 mergePropertiesFromObject组合起来构成了一个完整的临时模型工作流shallowCopy负责轻量草稿deepCopy负责深度快照mergePropertiesFromObject:负责安全回写。三者配合performInTransaction:既能享受 Realm 的持久化能力又不必为每一次试探性修改提心吊胆。学会这套组合拳你的 Realm 数据操作会稳健很多。【免费下载链接】Realm-JSONA concise Mantle-like way of working with Realm and JSON.项目地址: https://gitcode.com/gh_mirrors/re/Realm-JSON创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表