Swift Xcodeインデックスのフリーズまたはスロー


101

多分これは私だけがそのような迷惑な「機能」を体験しているものです:

Xcode 6.0.1からXcode 6.1にアップグレードした後、状況が変わりました。Xcode 6.1は、プロジェクトにインデックスを付けたり、ソースファイルをコンパイルしたりしています。プロジェクトは巨大なものではありません。ワークスペースにSwiftファイルとAWS SDK 2.0 Cocoapodsの束が含まれているだけです。全体のインデックス作成とコンパイルがスムーズに行えるようになるとは思いません。私はいくつかのaws-sdk-ios-samplesを試してみましたが、Xcode 6.1がそれらでどのように機能するかを確認したところ、同じ結果が永久に待っていました。

これまでに試した解決策:

  1. オーガナイザで「派生データ」を削除し、ワークスペースを再度開きます。(修正できない)
  2. Xcode 4-パフォーマンスの低下)のように.xcodeprojファイルで「パッケージの内容を表示」し、.xcworkspaceを削除する

残念ながらそれらのどれも機能しませんでした。

PS多分私はプロジェクトを再作成してみるべきですか?私のコンピューターの設定:MacBook Pro(Retina、13インチ、Mid 2014)、メモリ8 GB 1600 MHz DDR3、Yosemite搭載。(この小さなプロジェクトを実行するにはこれで十分だと思います。)



2
私はあまり助けにはなりませんが、私がすることは... xcode 6.xに時間を取らせてください。私がそれと戦うと、それは私を長時間ねじ込みますので、私はxcode 6が起動するまで待つだけです。私はそれを愚かな索引付けで実行させました。次に、iOSシミュレーターを個別に起動し、愚かな踏み台が表示されるまで待ちます。最後に、プロジェクトを実行すると、インデックス作成が「一時停止」と何度も言うという事実を見落とし、<#godObject#>に祈り、コーヒーを飲み、禅モードに入ろうとします。しかし、*ため息*、それは大雑把です:/そして私は本当にxcode 5.1.1が好きでした:|
staticVoidMan 2014年

この答えは私にとって
うまくいき

回答:


72

ファイルの分割、Xcode 6.2ベータ版のインストール、文字列連結ステートメントの破壊など、上記の提案の多くを試しました。最後に私がしたことは、テストデータに使用していた辞書リテラル宣言の配列を複数の.appendステートメントに分割することでした。

// This causes indexing/building to hang...
var test = [ [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ] ]

// This works fine.
var test = [ [ "a": false, "b": "c" ] ]
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])

また、その価値については、この配列の6番目のエントリが問題を引き起こしています。5つで十分です。


辞書で同じ解決策が私のために働いた。これを直接初期化すると、永久に実行されるインデックス作成が発生しました。init()段階的にそれを初期化することは完全に機能します。私.xcworkspaceもファイルを削除しなければならなかったことに言及する価値があります。
jboi

辞書を含まない私のためにそれを修正しました。宣言に8つの要素が含まれているタプルの配列だけです。11要素の追加に戻す必要がありました。正確な限界点を見つける必要はありませんでしたが、ビルドは10倍速くなりました。MavericksのXcodeバージョン6.1.1(6A2008a)。
Josh

私もちょうど6つの要素で問題にぶつかりました。5は大丈夫でした。
Justin Lau

これはXCodeの問題ですか、それともコンパイラの問題ですか?
Sljux

4
Xcode 7.3では、229項目の配列リテラルでこれを体験しました。分割する代わりに、Swiftに型を推測させる代わりに、型宣言を追加しました。私がそれをした後、それはうまくいきました。
ブリガム

34

私にとって唯一の有効な解決策は、すべての派生データを削除し(現在のプロジェクトだけでなく、フォルダー全体をクリーンアップする)、Xcodeを再起動することです。

  1. Xcodeでファイル/設定を開く

  2. ポップアップウィンドウの右端にある[場所]をクリックします

  3. "/ Users / Mac / Library / Developer / Xcode / DerivedData"の横にある小さな矢印アイコンをクリックします。DerivedDataフォルダーを含むXcodeフォルダーに移動します(以前のプロジェクトからの派生データがすべて含まれています) 。)

  4. DerivedDataフォルダーを削除する


1
@TravisM。手順を実行しましたか?ウィンドウ、オーガナイザ、プロジェクト、派生データの削除に移動しても機能しません。設定を行う必要があります。
ericgu 2015

@ericguええ、でもうまくいきませんでした。私は自分の問題を修正しましたが、ハードコードされたデータで辞書を一度に初期化することに関連していました。コードを移動して、ハードコードされたデータを一度に1行ずつ追加すると、フリーズ/スローの問題がすぐになくなりました。
Travis M.

私のマシンの〜/ Library / Developer / Xcode / DerivedData /にあるフォルダー。Xcodeの[ウィンドウ]> [プロジェクト]に移動して見つけることもできます。
Suragch

ありがとう。これは役立ちます。「forever indexing」の問題は、cocoaPodバージョンを更新してポッドインストールを実行した直後に始まります。
WKL 2016年

11

CocoaPodsを使用していますか?今日、同じ問題に出くわしました。(xCode 6.1.1を使用)

この問題を修正するために、プロジェクトディレクトリ内のフォルダとフォルダ内のすべてを削除し~/Library/Developer/Xcode/DerivedDataPods<project>.xcworkspace

次にターミナルを開き、プロジェクトディレクトリに移動して、pod install再度実行しました。


1
はい、そうです。今のところ、Xcodeは問題なく動作しています。しかし、それでも時折、sourcekitのクラッシュエラーが発生します。私の解決策は、派生データフォルダーを削除することです。
レナード2015年

これが他の誰かにもうまくいったことを見てうれしいです:) xCodeがCocoaPodライブラリのインデックスを作成しようとして、どこかに行き詰まっているようです。
Michael Schinis、2015年

1
Podsフォルダーと<project> .xcworkspaceファイルを削除してから、pod installを再度実行すると機能しました。
KML 2015年

9

今日も同じ問題がありました。Xcode 6.3.2、中規模のSwiftプロジェクト。ある時点でインデックス作成が開始され、インデックス作成が完了することはありませんでした。これを引き起こしたコードはタイプ[String:[String]]のディクショナリだったので、文字列配列を値として持つ文字列キーdictです。AからZまでのキーを持つこれらの2つがあり、これらの26のエントリのそれぞれには、5〜10個の文字列を持つ文字列配列が含まれています。

派生データを消去しても効果がありませんでした。それらの口述をコメントアウトするだけで、それは再び行きました。

正直なところ、これはばかげています!AppleはXcodeを修正する必要があります!Swiftプロジェクトをコンパイルするときはすでにひどく遅いですが、このようなバグは見事なものです。これでちゃんと仕事が出来ない!


6

まだこの問題が発生している人のために、これは私が楽しむようになった回避策であり、オブジェクトを1つずつ入力する必要がありません。

// instead of this, which freezes indexing
let keys = [keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM]    

// and instead of this, which is ugly & lengthy
var keys = [KeyboardKey]()
keys.append(keyQ)
keys.append(keyW)
...
keys.append(keyM)

// use this:
var keys = [KeyboardKey]()
keys.appendContentsOf([keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM])

1
うわー...全く同じ問題がありました。ありがとう!Appleにバグとして報告しました。あなたの言ったことは私にはうまくいきませんでした。長い配列を、それぞれ5つ以下の要素を持つ小さな配列に分割する必要がありました。
ma11hew28 2016

5

私にとっては、上記のすべてを試しても成功しませんでした。しかし、私がしなければならなかったのは、派生データフォルダーを削除してから、別のランダムプロジェクトを開いて、インデックスが作成されるのを待って、元の(機能しない)プロジェクトが機能するようにすることだけでした。

開発の世界を支持して、迅速なコンパイラーをオープンソースにします。そうすれば、私たち全員があなたの無能さに邪魔されることはありません。


3

Xcodeバージョン7.3(7D175)を使用しています

私は根本的な問題を理解したかもしれません。インデックス作成フェーズでスタックした2つのインスタンスがあります。

  • 変数に割り当てたクロージャーを作成し、型シグニチャーを省略しました。xcodeにはその型推論ステップに関する問題があったと思います。私が正しく覚えているなら、引数の1つは、オーバーロードされたコンストラクターを持つCGPointでした。私の仮説は、私の閉包が引数として受け入れる可能性が多すぎる可能性があるというものです。

  • 1つの型のインスタンスを返す代わりに、共通の基本クラスを持つ多くの型のインスタンスを返すことができるように、ファクトリーメソッドをリファクタリングしました。ファクトリーメソッドをどこで使用した場合でも、結果のオブジェクトを特定のタイプにキャストする必要があるようです(as?を使用するか、または特定のタイプを受け入れる変数にオブジェクトを割り当てることによって)。

以前の個人が述べた辞書宣言でも同じことが起こっているようです。アップルにバグレポートを提出しました。


2

6.1にアップグレードした後、同じ問題が発生しました。Xcodeは、特定のエラーメッセージを生成せずにコンパイルまたはインデックス作成でスタックします。

この問題は、swiftファイルの長い式の一部を複数の短い式に分解することで最終的に解決されました。私のプログラムの一部は、多くの異なる文字列変数を組み合わせて、より長い文字列を形成します。それらを単一の式に結合する試みと、加算代入演算子を使用する試みの両方が失敗しました。私はそれを次のような(単純化した)ものと同じようにすることで機能させることができました:

var a = "Hello"
var b = " "
var c = "World"
var d = "!"
var partA = a + b
var partB = c + d
var result = partA + partB

以前のXcodeバージョンで次のエラーを何度も受け取ることからこのアイデアを得ました。「式は複雑すぎて、適切な時間で解決できません。式を個別のサブ式に分割することを検討してください。」

お役に立てれば


はい、ありがとうございます。私は実際にこの種の提案をしました。また、1つのファイルの長さを1500行から約1200行に縮小しました。もちろん、新しいプロジェクトを作成し、すべてのファイルを1つずつインポートしました。その後、最後に戻ってきます。どれが究極の救世主なのか本当にわかりません。
レナード2014年

Swiftで長い式を分割することが私にとってはうまくいきました。
MandisaW 2016年

2

私は同じ問題で苦労しました。上記の2つの解決策(派生データの削除と.xcworkspaceの削除)を試してみましたが、成功しませんでした。また、ほとんどのコードを少しずつコメントアウトし、ほとんど何も残っておらず、インデックスがまだ動かなくなるまでファイルを削除してみました。

うまくいく解決策を見つけました、インデックス作成に問題のない古いXcodeバージョン6.1(6A1030)でプロジェクトを開いた後、以前使用していた最新のXcodeバージョン6.1(6A1052d)に戻し、インデックス作成は修正され、正常に機能し続けました。

私の結論は、これはXcodeバージョン6.1(6A1052d)のバグであり、今後のリリースで改善されることを期待しています。

問題はたまに再発しますが、毎回同じ修正が機能します。別の解決策は古いXcodeバージョン6.1(6A1030)をそのまま使用することだと思いますが、iOS 8.1を実行しているデバイスでは動作せず、最新のバグ修正がありません。


私は、永続的なインデックス作成の問題を解決するために、ほとんどの提案を試しましたが、これが私に有効な唯一の問題でした。古いXcode 6はありませんでしたが、Xcode 5はありました。ビルドはできませんでしたが、インデックスが作成され、その後、Xcode 6.1は正常にインデックスが作成されました。
SarahR 2014年

これは一時的な解決策にすぎず、数時間後にもう一度実行する必要があったことを忘れてしまいました。
SarahR 2014年

2

Xcode 8.3.3でこれを試しました。これが私の結果です:

インデックス作成がハングする原因となる、完全に細かいSwiftコードを記述できます。

インデックス作成がハングすると、ハングします。Swiftコードを変更しても、インデックス作成がハングしないようにしても効果はなく、ハングします。

プロジェクトを閉じて再度開くことは、その状況では役に立ちません。

Xcodeを終了して再起動すると役立ちます。インデックス作成はもはやハングしません(つまり、コードをハングさせないものに戻した場合)。

Macを再起動することも役立ちますが、必須ではありません。

ハングは完全に細かいSwiftコードが原因です。私が次のように見えた例

if let date = function1()
?? function2()
?? function3()
?? function4()
?? function5()
?? function6()
?? function7()
?? function8()
?? function9()
?? function10() {
    return date
}

インデックス作成がハングします。「??」のほとんどをコメントアウトしました 行とそれは(Xcodeを終了して再起動した後)大丈夫でした。1行ずつコメントを外します。いくつかの行では問題ありませんでしたが、次の行のコメントを外すとハングします。

明らかに役立つのは、コードを変更することだけです。


2

私のXcodeでは、解決策はすべての冗長ウィンドウを閉じることでした。何らかの理由で、多くの開いているウィンドウはXcodeを非常に遅くします。


私にとってこれも解決策でした。驚くべきことに、以前と同じ数の開いているウィンドウで問題なく機能していました
Christian

1

最後に、私は問題を「解決」しましたが、これは単なる回避策です。

別のプロジェクトを作成し、ファイルを1つずつ追加しました。次に、「非常に長い」viewcontroller.swiftファイルを見つけました。次に、そのコードをモジュールに分割し、繰り返し使用されるコードを別のSwiftファイルの関数にしました。また、長い表現は短い表現に分解すべきだという提案をオンラインで受けました。次に、インデックス作成とコンパイルが機能します。

だから今のところ、私はそれを「解決」しました。

しかし、これは正しくないと思います。Xcode IDEは、私の「非常に長い」Swiftファイルを処理するだけでは十分ではなく、1500行しかありません。Xcode 6.1はすでにXcode 6.0.1からのアップグレードですが、これは間違いなく(長い間存在する)バグだと思います。


1

私にとっては、Xcodeアプリを削除して再度ダウンロードし、インストールしました。これで問題は解決しました。少なくとも今のところ。


1

Xcodeのインデックス作成は通常、ストーリーボードでの支援やその逆など、提案やオートコンプリートのためのコードに対して行われます。しかし、あなたのxcodeプロジェクトをより速くするために、ターミナルを介してそれをオフ/オンにすることができます

インデックス作成をオフにする
デフォルトを書き込みcom.apple.dt.XCode IDEIndexDisable 1インデックス作成のデフォルトをオンに書き込みcom.apple.dt.XCode IDEIndexDisable 0

しかし、優れたRAMを備えた高速なMacを使用するためのより良いアプローチ。


2
インデックス作成をオフにすると、Xcodeが著しく機能しなくなるため、実行しないでください。誰かに新しいMacを購入するように言うのは決して正解ではありません。2年前のラップトップが最新のXcodeを処理できるはずです。
Knight0fDragon 2017年

macOS 10.13 Beta 7では、インデクサーが実行されるとすぐにXcode 9 Beta 6とXcode 8の両方をクラッシュさせる何かが導入されました。Xcodeを使い続ける唯一の方法は、機能が低下したバージョンであっても、これをオフにすることでした。
ペゴロン2017

0

彼らが理解するまで6.0.1に戻すことを気にしないのであれば、それが私にとってうまくいきました。6.1と6.1.1の両方で同じ問題が発生していました。今は元気です。6.2が出たら試してみます。

以前のバージョンのアップルソフトウェアは、次の公式開発サイトにあります。 https://developer.apple.com/downloads/index.action)にあります。

これを行う場合は、まず現在のXcodeのコピーを削除してください。


0

私は同じ正確なMacBook Pro上の迅速なファイルでXcode 6.1.1を使用しています。

3D文字列配列に行を追加し続けると、Xcodeが突然使用できなくなり、現在は何もできなくなります。

6.1に戻そうとし、うまくいけば問題はなくなるでしょう。


同じ問題があります。辞書の配列を追加した後、xcodeが使用できなくなりました...解決策は見つかりましたか?
アルマジニ2015

Xcode 6.1に戻りました。インデックス作成がずっと続くことはありませんでしたが、ビーチボールを4秒間タイプして取得することもありました。全体的に、物事を成し遂げるのに十分なコードを書くことができました。コードは一切変更していません。Xcode 6.1では、macbook proのバッテリーはあまり影響を受けていないように見えましたが、6.1.1を実行している私のmacbook air mid 2013では、バッテリー寿命が完全に切れています。Xcodeを起動すると、約12時間から2時間残ります。
gardner888 2015

0

これはXcode 6.3.2で見られます。私はリリースから1年後にコンパイラーが機能することを期待していましたが、残念ながらそうです。

上記の解決策のいずれも機能しない場合は、コードに構文エラーがないか確認してください。リファクタリングのプロセスで、クロージャーを抽出しましたが、パラメーターを修飾するのを忘れていました。

    let hangsInsteadOfError = { l, r in
        return l.nameFirst < r.nameFirst
        || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

    let fixingErrorAvoidsHang = { (l:User, r:User) -> Bool in
        return l.nameFirst < r.nameFirst
            || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

私がSwiftでの作業から何かを学んだのなら、問題のあるコードを見つけるためにバックトラックしすぎないようにするために、段階的に作業することです。


0
  1. インデックスのステータスは「インジケータサークル」または「進捗状況バー」ですか?
  2. 「インジケーターサークル」の場合は、最初から動かなくなっています。
  3. 他のプロジェクトを開いて確認します。すべて同じである場合は、システムの問題です。
  4. コンピュータを再起動するだけで、すべてがうまくいきます。

0

Xcode 8.2を使用していますが、この問題も発生しました。これは、複雑なタプル変数(タプルのサブ配列を持つタプルの配列)を定義した後に始まりました。タプルのサブ配列にプログラムで計算されるプロパティがある場合、事態は非常に遅くなります。

他のいくつかの回答が指摘しているように、インデックス付けには永遠に時間がかかり、変数の型を推測しようとしていると思います。

タイプを含めて変数を明確に定義することで、最初に問題を解決しました。プロパティを更新するときは、変数の定義で計算するのではなく、最初に計算してからタプルに割り当てます。

これがサンプルコードです。

var sectionTuples: [(section: String, rows: [(name: String, subtitle: String)])] = []
let subtitle1: String = "" // something calculated dynamically
let subtitle2: String = "" // something calculated dynamically
sectionTuples = [(
section: "Section 1", rows: [
(name: "name1", subtitle: subtitle1),
(name: "name2", subtitle: subtitle2)
])]

つまり、Xcodeが複雑な構造を推測しないようにする必要があります。


0

私は同じ問題を抱えていました。私のXcodeは8.2.1です。しかし、私の場合、33のキーと値のペアを持つディクショナリの配列を作成したいと思いました。私は次の方法でインデックス作成に行き詰まっていました:

var parameter = [String : AnyObject]()
var finalArray = [parameter]

for item in listArray
{
    parameter = ["A": item.a as AnyObject, "B": item.b as AnyObject, "C": item.c as AnyObject, ... , "Z": item.z as AnyObject]

    finalArray.append(parameter)
}

以下は私のために働きました:

var parameter = [String: AnyObject]()
var finalArray = [parameter]

for item in listArray
{
    parameter["A"] = listArray.a as AnyObject
    parameter["B"] = listArray.b as AnyObject
    parameter["C"] = listArray.c as AnyObject
    parameter["D"] = listArray.d as AnyObject 
    .
    .
    .
    parameter["Z"] = listArray.z as AnyObject 
    finalArray.append(parameter)
}

0

私にもこの問題があり、「+」演算子を使用して式を削除/変更することで解決しました。

私はこれを変更しました:

var mainArray = arrayOne + arrayTwo + arrayThree + arrayFour + arrayFive

これに:

var mainArray = arrayOne
mainArray += arrayTwo
mainArray += arrayThree
mainArray += arrayFour
mainArray += arrayFive

問題は解決しました。

私のマシンは2013年後半にMBPを使い果たしました


まさに私の経験。それは完全に細かいSwiftコードでハングし、それを修正する唯一の方法はコードを変更することです。
gnasher729 2017

0

Xcode 6.1.1に更新することをお勧めします

正式にリリースされ、インデックス作成の問題が解決されました。アップデートの説明では、安定性の修正が適用されているため、より安定した動作をする可能性が非常に高いとされています。


7
面白い。私にとっては、6.1.1が導入 6.1で罰金を開いたプロジェクトで、無限のインデックスの問題を。サイン
Pascal Bourque 2014

そうですか。今回のケースでは、拡張クラスを使用して式を簡略化し、クラスサイズを縮小しました。これは私たちがやらなければならなかったことはかなりばかげていますが、それは私たちがやらなければならなかったことです。そして今のところそのトリックをやっているようです。また、行をコメントアウトすることにより、Swiftコンパイラーが考えているように、コードのどの部分が実際に「過度に複雑」であるかを絞り込み、可能な限り複雑さを減らしました。かなり煩わしいので、すぐに修正してください。
Angel Naydenov 14


0

私は次のような表現を持っていました:

let x = (value as? Int) ?? someDefault

また

guard let x = (dateFormatter().string(from: Date()) + msg + "\n").addingPercentEncoding(...) else { ... }

したがって、ポイントは幼稚園レベルの式のみを含むようにファイルを書き直すことであり、索引付けの問題はなくなります。


0

Xcode 11.5(11E608c)と元の質問から6年後の同じ問題。私はこの質問でリンゴに「マーク」を付けて、この混乱を確認できるようにしたいと思います。これは大規模なプロジェクト(> 1000ファイル)であり、私は時計の下にいたので、100を超えるファイルが変更されていて、戻ることができないというフリーズインデックスに気付いたとき。

私はすべてを試しました:

  1. 派生データをクリアしてビルドする
  2. xcodeを再起動し、macを再起動します
  3. ソースを削除して追加する
  4. 辞書リテラルなどを検索

問題は配列の作成でした:

private var overlayColors: [UIColor] = [UIColor(hex: "#b71c1c"), UIColor(hex: "#4a148c"),
                                        UIColor(hex: "#880e4f"), UIColor(hex: "#1de9b6"),
                                        UIColor(hex: "#f50057"), UIColor(hex: "#311b92"),
                                        UIColor(hex: "#f44336"), UIColor(hex: "#651fff"),
                                        UIColor(hex: "#d500f9"), UIColor(hex: "#3d5afe"),
                                        UIColor(hex: "#bf360c"), UIColor(hex: "#0d47a1"),
                                        UIColor(hex: "#006064"), UIColor(hex: "#2979ff"),
                                        UIColor(hex: "#ff6f00"), UIColor(hex: "#1a237e"),
                                        UIColor(hex: "#795548"), UIColor(hex: "#004d40"),
                                        UIColor(hex: "#00e676"), UIColor(hex: "#01579b"),
                                        UIColor(hex: "#33691e"), UIColor(hex: "#827717"),
                                        UIColor(hex: "#76ff03"), UIColor(hex: "#ffc400"),
                                        UIColor(hex: "#e65100"), UIColor(hex: "#00b0ff"),
                                        UIColor(hex: "#ff3d00"), UIColor(hex: "#616161"),
                                        UIColor(hex: "#263238"), UIColor(hex: "#ff1744")]

xcodeがインデックス作成をフリーズしたときに、次の手順を実行したときに、悪いSwiftファイルを発見するのに役立ちました

  1. アクティビティモニターを開く-> "swift"プロセス->プロセス情報を表示->ファイルとポートを開きます。これにより、このプロセスが実行しているファイルのリストが表示され、考えられる不良ファイルのリストがドリルダウンされます。
  2. 他の便利なツールはこのスクリプトです SOURCEKIT_LOGGING=3 /Applications/Xcode.app/Contents/MacOS/Xcode &> ~/Documents/xcode.logこれによりXcodeがレベル3の詳細で開始され、ログファイルへのロギングが開始されます。
  3. ログファイルで、swiftファイルの最後のエントリを検索します。例: "my_project / Source / App /"

これは完全なソリューションではありませんが、ドリルダウンしてどこを見ればよいかを知ることは役立ちます。

アクティビティモニターを開く-> "swift"プロセス->プロセス情報を表示->ファイルとポートを開きます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.