肇鑫的技术博客

业精于勤,荒于嬉

Realm的坑(一)

Realm中常见的“Realm accessed from incorrect thread”问题的分析总结

Realm的Results中,有一个很有用的特性,叫做自动更新。顾名思义,就是这个结果会在使用时自动重新查询,已保证最新。当然,这也带来了新的问题。

一旦在创建该变量的线程之外使用该变量,就会导致程序崩溃。

比如,今天我就是在请求通知权限的代码中使用了tasks变量。结果导致程序崩溃。因为这个请求是调用了系统的请求,不是程序本身的线程。

解决办法

  1. 新建realm,重新查询
  2. 使用临时变量,而不使用Results的变量。
  3. 使用DispatchQueue.main.async,更改执行的thread。

备注

print(Thread.current) //可以调试当前的thread

相关

Realm的坑(一)
Realm的坑(二)
Realm的坑(三)
Realm的坑(四)

命令行下使用Swift 2.3 工具链(Toolchain)的方法

我们知道Xcode 8 beta 同时提供了Swift 3.0 和Swift 2.3来供我们选择。并且我们还知道,可以在Xcode的偏好里,选择对应的工具,如图1-1所示。

图1-1 在Xcode中选择命令行工具

在Xcode中选择命令行工具w750

此时,在终端中查看swift的版本,会是3.0的,如图1-2所示。

代码 1-2 终端查看Swift版本

~ zhaoxin$ swiftc -v
Apple Swift version 3.0 (swiftlang-800.0.42.1 clang-800.0.36.1)
Target: x86_64-apple-macosx10.9
~ zhaoxin$ xcrun swiftc -v
Apple Swift version 3.0 (swiftlang-800.0.42.1 clang-800.0.36.1)
Target: x86_64-apple-macosx10.9

Swift.org官方给出的建议是使用添加环境变量的方式。

$ export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:"${PATH}"

但是这样做只会影响swiftc,不会影响xcrun swiftc。

~ zhaoxin$ export PATH=/Applications/Xcode-beta.app/Contents/Developer/Toolchains/Swift_2.3.xctoolchain/usr/bin:"${PATH}"
$ swiftc -v
Apple Swift version 2.3 (swiftlang-800.10.11 clang-800.0.36)
Target: x86_64-apple-macosx10.9
$ xcrun swiftc -v
Apple Swift version 3.0 (swiftlang-800.0.42.1 clang-800.0.36.1)
Target: x86_64-apple-macosx10.9

阅读xcrun的帮助,我们可以发现:

--toolchain <name> 
		Specifies which toolchain to use to perform the  lookup.  If  no
		--toolchain argument is provided, then the toolchain to use will
		be taken from the TOOLCHAINS environment variable, if present.

OK