Avatar
omochimetaru 1/9/2018 7:13 AM
バグか仕様か悩ましいですねこれは
7:14 AM
例外というか実行時クラッシュのはずです 排他則の動的検出にひっかかっていて
7:14 AM
reloadメソッドがmutatingなのでProviderのインスタンスは書き込みアクセスされているんですが
7:15 AM
completionブロックの中で provider.layoutを呼んでいるので、これは読込アクセスなんで
7:15 AM
書き込みアクセス保護中のオブジェクトにたいして読込アクセスをしてはいけないので
7:15 AM
クラッシュするっていうのがまず基本で
7:16 AM
で、// 2 をコメントアウトするとクラッシュしなくなる理由については予想ですが
7:16 AM
stored propertyを1つも持たないstructに関しては
7:16 AM
書き込みアクセスがあろうが実際に書き込みの影響を受けるメモリ領域を持っていないので
7:16 AM
同時アクセスをしても問題ないはずです
7:16 AM
だからクラッシュが発生しなくなるんだと思います
7:17 AM
ただそれが仕様上許された例外的な挙動なのか、実装の都合でたまたまそうなっているのかはわかりません。
7:17 AM
3でmutatingを外すと動くようになるのは、 reloadが読込アクセスに降格するからで
7:18 AM
読み込みアクセスは重複が許されてるのでこれはLoE違反しないです。