2016-09-17 28 views
54

我已經安裝了Xcode 8.0並將Swift 2.2轉換爲3.0(該過程也花了很多時間,我只是讓我的Mac整晚運行)。我沒有一個大項目(大約20個文件)。我也在使用Pods。索引以前的Xcode版本(< 8.0)運行速度很快,但現在升級後,進度條卡在一個位置(我已經等待一個小時)。Xcode 8.0 Swift 3.0緩慢索引和建設

事情我已經試過了沒有幫助我:

  • 清洗DerivedData文件夾,重新啓動的Xcode
  • 清洗項目和重新啓動的Xcode
  • 刪除Pods目錄與<project>.xcworkspace,然後重新安裝
  • 重新啓動的Mac
  • 嘗試建立項目沒有豆莢
  • 重新安裝的Xcode
  • 試圖在另一臺Mac克隆與項目

這實在是不冷靜做出的軟件,發佈時開發商必須花時間解決這種荒謬的問題。這是非常令人失望的。 任何想法如何解決這個問題?

+0

你能建立它呢?如果是這樣,您可以使用Build Time Analyzer來了解更多關於構建過程正在放慢的事情。 https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode –

+0

@Robert不幸的是,它不是建設 – Danny

+0

生成日誌顯示什麼? (點擊看起來像卡通泡泡的最右邊的按鈕。)或控制檯應用程序中的任何內容? –

回答

24

我通過評論所有文件然後逐個刪除評論解決了這個問題。我發現問題仍在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) 
    } 
} 
+6

這可能是一個與推斷數組類型的問題。 而不是使用附加做到這一點: var array:[String] = [第一,第二,第三,第四,第五] –

+2

這是錯的... –

49

轉到項目設置,然後編輯>添加建立設置>添加用戶定義的設置,並添加以下內容:

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

添加此標誌將我們的清理編譯時間從7分鐘到65秒,用於40KLOC快速項目,奇蹟般。也可以確認2個朋友在企業項目上看到了類似的改進。

我只能假設這是在Xcode 8.0

+2

也爲我們的團隊工作過。我們正在運行Xcode 8.0,Swift 2。3在Swift和Objective C的代碼庫上。3 –

+2

它可以工作,但你知道嗎? –

+0

@ hardik.shah - 我不知道。當它工作時我無法相信它。 – Chris

6

我有同樣的問題,某種錯誤的,因爲只有升級到斯威夫特3/8的XCode,它似乎是由大陣文字引起的。

我能夠通過向分配給數組文本的變量添加類型註釋來解決此問題,例如,的

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

代替

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

我有類似的問題,並按照本指南進行調試:http://irace.me/swift-profiling 我的問題是我有零的一些字符串合併運算,例如:

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

四種方法導致建築時間增加2分鐘。

+0

鏈接指南是要走的路,在幾分鐘內找到罪魁禍首(也無合併運營商),並能夠修改代碼... – CRE8IT

2

我試過上述解決方案,但問題仍然存在。調試工作也很奇怪。經過幾天的研究,我找到了下面的解決方案。

選擇主目標>構建設置。配置爲下面的圖像。

enter image description here

+0

這是爲我做的,謝謝 – user2977972

0

添加後的設定,

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

我們的項目清理構建編譯從1200年代倍至180秒650個迅速文件。但是這會導致編譯失敗。每一個變化需要180秒時增加編譯只需要60

3

,誰想要找到其中的編譯器是「捕獲」編譯

添加到Other Swift Flags-Xfrontend -warn-long-function-bodies=50

檢查完整的答案here

0

這是一個Xcode bug(Xcode 8.2.1),當你有一個大的字典或嵌套字典時,它會發生。你必須將你的字典分解爲更小的部分,並用append方法添加它們,直到Apple修復該錯誤。

+1

錯誤修復了嗎? – ArgaPK

+0

是的,我已經向蘋果報告了這個bug,他們說他們修復了Xcode –

+0

的最新版本,謝謝,現在我將升級到最新版本。 – ArgaPK

4

我有同樣的問題,並通過逐行我的代碼行刻意去解決它,原來斯威夫特3喜歡串插,而不是使用+符號,即

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

如果你一直在使用上述代碼樣式代替它;

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

而且您的構建時間會立即恢復正常。

+0

同樣的道理!該工具[https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode](https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode)可以幫助我找出每個不好的文件。 – hstdt

0

這時候「索引」是停留在Xcode 8.2.1和斯威夫特3爲我工作:

我一直有兩個項目開放,虛設項目,我工作的項目。我還連接了一臺iPad Air設備,用於運行我的項目。當我的項目停留在「索引」時,我切換到我的虛擬項目並在我連接的iPad Air設備上運行我的項目。然後我停止項目 並切換回我正在進行的項目,並且「索引」是神奇地完成。如果你沒有連接物理設備,這也應該只適用於模擬器。

1

我遇到了同樣的索引問題,但它只發生在我在設備上運行/調試,然後切換到左上角工具欄上的其他設備(Target> iPhone)時。

上述解決方案都不適用於我。

我的解決方案:我刪除了我的本地git工作副本,並從我的「起源」中克隆了一個新副本。

(這裏是xcuserdata /共享/會話等,可能導致此問題的文件夾?中的一些「神奇」的文件)

-1

什麼解決這對我來說是使用鍵設置字典中的值

let dict: [string:any]() 
dict["key"] = "value" 
dict["key1"] = "value" 
dict["key2"] = "value" 
return dict 

如果你有一個很長的字典,它可能會或可能不會導致編譯循環導致生成時間過長。任何長度超過8個鍵都應該設置。

0

不是我認爲這與OP的問題有關,但最近我對XCode 8的放緩速度停止了。我最終發現這是我的錯誤(我記得無意中這麼做) - 我將XCode.app添加爲框架引用。這基本上使XCode搜索並索引整個XCode.app文件夾。一旦我看到了錯誤,並刪除框架它再次變得很好:)

0

我有一個功能,花了一分鐘編譯,經過一些調查後,我發現罪魁禍首是檢查是否有足夠的時間已經過去保存日期:

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倍我被檢查這樣做了以後,以解決這個問題,編譯時間從一分鐘到只有幾毫秒切割。

這種問題極有可能發生在其他地方的type-in​​ferance和math的組合中,因此確保在代碼中的其他任何地方都不會發生這種情況。

1

我的問題是字典。我有不同的大字典。

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 
0

備份您的項目刪除最後一個更新的項目備份後,然後重新啓動的Xcode簡單:-)