web-dev-qa-db-ja.com

Xcode 8.0 Swift 3.0のインデックス作成とビルドが遅い

Xcode 8.0をインストールし、Swift 2.2を3.0に変換しました(そのプロセスにも多くの時間がかかりました。Macを一晩中実行したままにしました)。大きなプロジェクトはありません(約20ファイル)。 Podsも使用しています。以前のXcodeバージョン(<8.0)のインデックス作成は高速で機能していましたが、アップグレード後、進行状況バーが1つの位置で止まっています(既に1時間待機しています)。

私が試したことは私を助けませんでした:

  • DerivedDataフォルダーをクリーンアップし、Xcodeを再起動しました
  • プロジェクトをクリーンアップし、Xcodeを再起動しました
  • <project>.xcworkspacePodsディレクトリを削除してから、再度インストールしました
  • 再起動したMac
  • ポッドなしでプロジェクトをビルドしようとしました
  • 再インストールされたXcode
  • クローン化されたプロジェクトで別のMacで試してみた

開発者がこのようなばかげた問題の解決に何時間も費やす必要がある場合、ソフトウェアのリリースを行うのは本当にクールではありません。とても残念です。これを修正する方法はありますか?

61
Danny

すべてのファイルにコメントを付けてから、コメントを1つずつ削除することで問題を解決しました。 here のように、問題はまだ配列宣言にあることがわかりました。

私はこのようなコードを持っていて、プロジェクトはインデックスを作成していませんでした:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first, second, third, fourth, fifth]
    }
}

私はこれをこれに変更し、インデックス作成が機能し始めました:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first]

        array.append(second)
        array.append(third)
        array.append(fourth)
        array.append(fifth)
    }
}
24
Danny

プロジェクト設定に移動し、[エディター]> [ビルド設定の追加]> [ユーザー定義設定の追加]に移動し、次を追加します。

Swift_WHOLE_MODULE_OPTIMIZATION = YES

このフラグを追加すると、40KLOC Swiftプロジェクトのクリーンビルドのコンパイル時間が7分から65秒に奇跡的に短縮されました。また、2人の友人がエンタープライズプロジェクトで同様の改善を見たことを確認できます。

私はこれがXcode 8.0の何らかのバグであるとしか推測できません

52
Chris

Swift 3/XCode 8にアップグレードしてから同じ問題が発生しましたが、これは大きな配列リテラルが原因のようです。

配列リテラルに割り当てられている変数に型注釈を追加することで問題を修正できました。

let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]

の代わりに

let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
6
Ben Simon

私は同様の問題を抱えていて、このガイドに従ってデバッグしました: http://irace.me/Swift-profiling 私の問題は、たとえば文字列:

let name = "\(someString ?? "")"

また、これを使用した4つの方法により、構築時間が2分長くなりました。

5
Stefan Nestorov

私は同じ問題を抱えて、コードを一行一行丹念に調べて解決しましたが、Swift 3は+記号を使用するよりも文字列の補間を好むことがわかりました。

let url = "http://yahoo.com" + "someWebPage" + "whereItsInteresting" 

上記のスタイルのコードを使用している場合は、次のコードに置き換えます。

let url = "http://yahoo.com\(someWebPage)\(whereItsInteresting)"

そして、ビルド時間はすぐに通常に戻ります。

5
silly_cone

コンパイラが「キャッチ」された場所を見つけたい人向け

Other Swift Flags-Xfrontend -warn-long-function-bodies=50に追加

完全な回答を確認してください こちら

3

上記の解決策を試しましたが、問題は引き続き発生します。デバッグも奇妙に動作します。数日間の調査の後、私は以下の解決策を見つけました。

メインターゲット>ビルド設定を選択します。以下の画像として設定します。

enter image description here

2
Tai Le Anh

コンパイルするのに1分以上かかった関数があり、いくつかの調査の後、犯人が保存された日付から十分な時間が経過したかどうかをチェックしていることがわかりました。

let myStoredDate: Double = // Double representing a time in the past

// if at least one week (60 * 60 * 24 * 7 seconds) has passed since myStoredDate
if Date().timeIntervalSince1970 - myStoredDate > (60 * 60 * 24 * 7){
    // do stuff
}

このコードはコンパイルに10秒以上かかります。このコードが異なる番号で複数回繰り返されると相まって、コンパイルに時間がかかりすぎていました。間隔を事前計算することでこれを修正できました

let myStoredDate = // Double representing a time in the past

//it is important to explicitly specify that the variable is a Double
let interval: Double = 60 * 60 * 24 * 7

if Date().timeIntervalSince1970 - myStoredDate > interval{
    // do stuff
}

私がチェックしていた〜10回でこれを行った後、コンパイル時間は1分以上から数ミリ秒に短縮されました。

この問題は、他の場所で型推論と数学の組み合わせでも発生する可能性が非常に高いため、コード内のどこでもこのようなことが起こらないようにしてください。

1
Jojodmo

これがOPの問題に関連しているとは思わないが、私にとってXCode 8は最近停滞した。私は最終的にそれが私の間違いであることがわかりました(そして、誤ってそれを行ったことを覚えています)-私はXCode.appをフレームワーク参照として追加しました。これにより、本質的にXCode検索とXCode.appフォルダー全体のインデックス作成が行われました。間違いを見つけてフレームワークを削除すると、再びうまくいきました:)

1
steve

私の問題は辞書でした。私はさまざまな大きな辞書を持っていました。

let values = ["address":addressTextField.text,"city":cityTextField.text,"zipCode":zipCodeTextField.text,"state":stateTextField.text,"pet":answerLabel.text,"rentStart":rentStartTextField.text,"rentEnd":rentEndTextField.text,"rent":rentTextField.text,"phone":phoneTextField.text,"email":emailTextField.text,"status":leaseStatusTextField.text,"bedrooms":bedroomTextField.text,"parking":parkingLabel.text,"furnish":furnishLabel.text,"utilities":utilitiesTextField.text,"laundry":laundryTextField.text,"paymentCycle":paymentCycleTextField.text,"note":noteTextView.text]

私はそれを分解しました:

        var values = ["address":addressTextField.text]
        values["city"] = cityTextField.text
        values["zipCode"] = zipCodeTextField.text
        values["state"] = stateTextField.text
        values["pet"] = answerLabel.text
        values["rentStart"] = rentStartTextField.text
        values["rentEnd"] = rentEndTextField.text
        values["rent"] = rentTextField.text
        values["phone"] = phoneTextField.text
        values["email"] = emailTextField.text
        values["status"] = leaseStatusTextField.text
        values["bedrooms"] = bedroomTextField.text
        values["parking"] = parkingLabel.text
        values["furnish"] = furnishLabel.text
        values["utilities"] = utilitiesTextField.text
        values["laundry"] = laundryTextField.text
        values["paymentCycle"] = paymentCycleTextField.text
        values["note"] = noteTextView.text
        values["owner"] = userID
1
Ahmadiah

同じインデックスの問題が発生しましたが、デバイスで実行/デバッグしてから、左上のツールバー(ターゲット> iPhone)で別のデバイスに切り替えたときにのみ発生しました。

上記の解決策はどれも私にとってうまくいきませんでした。

私の解決策:ローカルgit作業コピーを削除し、「Origin」から新しいコピーを複製しました。

(xcuserdata/shared/sessionなどのフォルダー内に、この問題を引き起こした可能性のある「マジック」ファイルがありますか?)

1
Tailz

プロジェクトをバックアップし、バックアップ後に最後の更新プロジェクトを削除してから、Xcode simpleを再起動します:-)

1
Shakeel Ahmed

これはXcodeのバグ(Xcode 8.2.1)であり、大きな辞書リテラルまたはネストされた辞書リテラルがある場合に発生します。辞書を小さなパーツに分割し、Appleがバグを修正するまでappendメソッドで追加する必要があります。

0
Pink Panther

これは、Xcode 8.2.1およびSwift 3で「インデックス作成」がスタックしている場合に機能します。

私は常に2つのプロジェクト、ダミープロジェクトと作業中のプロジェクトを開いています。また、プロジェクトを実行するiPad Airデバイスが接続されています。プロジェクトが「インデックス作成」で停止した場合、ダミープロジェクトに切り替えて、接続されているiPad Airデバイスでプロジェクトを実行します。次に、プロジェクトを停止し、作業中のプロジェクトに戻ります。「インデックス作成」は魔法のように終了します。これは、物理デバイスが接続されていない場合にのみシミュレーターでも機能するはずです。

0
ironarrow

設定を追加した後、

Swift_WHOLE_MODULE_OPTIMIZATION = YES

650 Swiftファイルの1200〜180秒のクリーンビルドコンパイル時間。ただし、これにより、コンパイルが失敗します。コンパイルの増加に60秒しか必要ない場合、すべての変更にはコンパイルに180秒が必要です。

0
Suric