resource目录文件过大导致Swift Playground运行速度慢

resource目录文件过大导致Swift Playground 反应慢

swift语言发布时,苹果为之提供了Playground工具。
有了Playground工具,测试API什么的不用开一个项目。iOS 模式可以模拟大部分手机环境,不用启动手机,确实方便了很多。

最近写了一段处理视频文件的例子。
发现Playground 反应很慢。每次输入内容时都会时时分析代码。导致电脑反应很慢,基本没法使用。
有没有屏蔽自动解析的开关。

电脑刚升级了10.11, Xcode刚升级了7.3。以为是操作系统导致Playground变慢,遂作罢。

昨天运行了苹果的Exploring San Francisco例子,发现修改时速度有了不少提升。

而打开以前的例子,发现编辑时反应仍然很慢。

怀疑是项目的独有问题。
测试项目的一个特点就是资源文件里面,导入了几个视频文件,有上百M大小。

把视频文件移动到共享目录下面。
Playground共享目录位置: “~/Documents/Shared Playground Data”

把读取资源的方式从

1
let videoUrl = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("test", ofType: "mp4"))

修改为:

1
let videoUrl = XCPlaygroundSharedDataDirectoryURL.URLByAppendingPathComponent("test.mp4")

这样做了以后,果然Playground反应速度正常了。

猜测原因:

  1. Playground编译代码时会像安装手机应用一样拷贝资源。
  2. Playground编译代码时每次会分析资源文件。

关于Playground的一点知识总结。

  1. Playground像一个模拟的开发项目。resource目录资源会拷贝到虚拟运行环境。

    以下是一个运行时sandbox目录例子:

    1
    2

    file:///var/folders/xs/lyvcj45d7d913dnc_b_2_n7h0000gn/T/com.apple.dt.Xcode.pg/containers/com.apple.dt.playground.stub.iOS_Simulator.SwiftDemo-CC8C8EED-BC7C-4848-8D2A-08AEEA660B2C/

    sandbox 目录下又一个Documents目录,和手机开发时目录类似

Documents目录下又一个“Documents/Shared Playground Data”目录,该目录link到“~/Documents/Shared Playground Data”。

所以“~/Documents/Shared Playground Data”目录的文件对所有的Playground实例都是可见的。

  1. 测试涉及到异步执行的代码时,为了等待异步任务执行完毕,需要设置Playground为持续执行状态。
1
2
3
4
5
6
7
8
//设置永久执行标志
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

//执行异步任务
obj.asyncTask(){
//终止Playground
XCPlaygroundPage.currentPage.finishExecution()
}
  1. 显示UIViewController实例的View内容
1
XCPlaygroundPage.currentPage.liveView = vc.view
  1. 任何的改动,都会导致Playground重新编译执行。重新编译执行会导致正在执行的进程终止。如果测试的例子会产生临时文件,记得经常清理,免得造成空间的浪费。创建视频、压缩文件都会产生临时文件。