Framework中开发Coredata相关逻辑时的准备工作

当执行以下代码,获取托管模型时,如果参数为nil,则默认到mainbundle去查找模型文件并加载。

+[NSManagedObjectModel mergedModelFromBundles:]

一般情况下,使用bundle去包装一些资源文件。所以需要把托管模型文件,放到framework对应的bundle目录中。
使用xcode创建的托管模型文件为.xcdatamodeld,通过测试发现,将.xcdatamodeld加载并不能读取文件中entity。在build日志中可发现 xcode是通过 momc 去对.xcdatamodeld做了一些转换的工作。
+[NSManagedObjectModel mergedModelFromBundles:]加载的并不是.xcdatamodeld而是通过momc处理之后的momd文件(其实是个文件夹)。
所以要想办法将momd文件放到framework的bundle中。

下面就是编译脚本,把以下脚本添加到Build Phases中,

echo "开始编译coredata模型文件"
# 搜索路径 搜索*.xcdatamodeld
search_path="${SRCROOT}"
# 输出路径 输出到.bundle文件中,前提是bundle文件要存在
output_path="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/${PRODUCT_NAME}.bundle"
# 查找momc文件,用来编译*.xcdatamodeld
momc_path="${DEVELOPER_BIN_DIR}/momc"
echo "xcdatamodeld 搜索路径 =====> ", ${search_path} 
echo "momd 输出路径 =====> ", ${output_path} 
# 删除旧文件
for dir in `find ${search_path} -name '*.momd'`
do
echo "删除旧momd,路径===>${dir}"
`rm -rf ${dir}`
done

# 在搜索路径中搜索*.xcdatamodeld
for dir in `find ${search_path} -name '*.xcdatamodeld'`
do 
echo "找到 xcdatamodeld文件,路径===>${dir}"
echo "开始编译 xcdatamodeld文件,路径===>${dir}"
# 编译*.xcdatamodeld
`${momc_path} ${dir} ${output_path}`
echo "结束编译 xcdatamodeld文件,路径===>${dir}"
done

You Might Also Like
发表评论