10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-17

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

環境

  • XCode 6.4
  • Swift 1.2

状況

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

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?