うちのいぬ Tech Blog

Tech Blog of Uchinoinu/My dog

XCode 6.4 の Build (Swift source file の Compile) や Indexing あたりがすごく遅くなる原因と対応 - Dictionary編

この状況に対して、この方法をとったらなんとかなりましたという備忘録です。 別の方法や見解もあるようなのでそちらも参考にしてください。

環境

状況

TableViewを実装していて、Realmと絡めたり、SectionやらIndexやらSearchやら色々盛り込んだりしたものを作っていたところ、ふと Build が激遅になりました。

Build 状況を確認したところ Compile Swift source files であるファイルが激遅なことが判明。

Screen Shot 2015-08-18 at 06.19.41.png

Screen Shot 2015-08-18 at 06.20.25.png

ずっとindicator がクルクル回りっぱなしで、Macのfanが奇声を上げ始め、あらゆるアプリがモサモサし始め、終いにはフリーズし、なんとそのBuildをStopさせることすらできないという状況になりました。

原因

コードの中でRealmからデータを取り出してDictionaryに入れて、TableViewControllerにreturnしているfunctionがありました。

そのDictionaryの作り方に問題があったようです。

func getItemDic() -> Dictionary<String, Array<Dictionary<String, Any>>> {
  // hogehoge
}

↑な感じの Dictionlary of Array of Dictionary を返すメソッドですが、問題は以下の部分。

for eachObject in allObjectsFromDB {
  var tmpDic: Dictionary<String, Any> = [
    "id" : eachObject.id,
    "name" : eachObject.name
   ・
   ・
   ・
  ]
}

宣言時に値を入れ込んでいる方法だと遅くなる様です。 (とはいれ必ずしもすべてのケースで遅くなるわけではないようです。。。)

対応

値を入れずに空で宣言して、後から値を入れるとコンパイルがいい感じになりました。

for eachObject in allObjectsFromDB {
  var tmpDic = Dictionary<String, Any>()
  tmpDic["id"] = eachObject.id
  tmpDic["name"] = eachObject.name
}

また、最初の宣言で入れる値が少数だったら問題ないなどの記事も見受けられたので、なんともはっきりしたことはわかっていませんが、とりあえず備忘録でした。

References