[Ios] XCode 8編譯速度很慢


Answers

自從升級到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"]
Question

自從Swift 3和XCode8開始,我的項目編譯起來相當慢。 每次我把一個空行添加到一個文件,重新編譯需要一整分鐘。 當我檢查輸出時,沒有特定的文件需要很長的時間。 (我也用這個工具來衡量它: https//github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

它總是一次編譯4個文件。 “節奏”相當穩定。 只是很慢...

另外:每當我打開或切換文件,它可能需要很長時間,直到我自動完成,或錯誤/警告。

我可以檢查什麼東西? 我幾乎覺得有一個我設置的標誌,就像瘋了一樣拖慢了構建速度。

編輯:這不是一個解決方案的基本問題,但我花了一些時間移動更多的代碼框架。 這有所作為(僅僅因為它每次都要重新編譯更少的文件)。 這不應該是必要的,但它是難以承受的...我當然仍然非常尋求一個適當的解決方案。




在我的例子中,我使用了一個輔助函數來將一些數據保存在Firebase中。 這個函數返回一個包含大約20個元素的字典,大約需要40分鐘。 我的解決方案是初始化一個空的字典,然後將項目逐個添加到someDict 。 現在編譯不到30秒。 我希望它有幫助。

之前

func toAnyObject() -> AnyObject {
  return
      ["BookingAmount":BookingAmount,
     "BookingNumber":BookingNumber,
     "PostCode":PostCode,
     "SelectedBathRow":SelectedBathRow,
     "SelectedBedRow":SelectedBedRow,
     "DateAndTime":DateAndTime,
     "TimeStampDateAndTime":TimeStampDateAndTime,
     "TimeStampBookingSavedInDB": TimeStampBookingSavedInDB,
     "FrequencyName":FrequencyName,
     "FrequecyAmount":FrequecyAmount,
     "insideCabinets": insideCabinets,
     "insideFridge": insideFridge,
     "insideOven": insideOven,
     "laundryWash": laundryWash,
     "interiorWindows": interiorWindows,
     "FullName":FullName,
     "SuppliesName":SuppliesName,
     "SuppliesAmount":SuppliesAmount,
     "FlatNumber":FlatNumber,
     "StreetAddress":StreetAddress,
     "PhoneNumber":PhoneNumber,
     "EmailAddress":EmailAddress] as AnyObject

}

  func toAnyObject() -> AnyObject {

    var someDict = [String : AnyObject]()
    someDict["BookingAmount"] = self.BookingAmount as AnyObject?
    someDict["BookingNumber"] = self.BookingNumber as AnyObject?
    someDict["PostCode"] = self.PostCode as AnyObject?
    someDict["SelectedBathRow"] = self.SelectedBathRow as AnyObject?
    someDict["SelectedBedRow"] = self.SelectedBedRow as AnyObject?
    someDict["DateAndTime"] = self.DateAndTime as AnyObject?
    someDict["TimeStampDateAndTime"] = self.TimeStampDateAndTime as AnyObject?
    someDict["TimeStampBookingSavedInDB"] = self.TimeStampBookingSavedInDB as AnyObject?
    someDict["FrequencyName"] = self.FrequencyName as AnyObject?
    someDict["FrequecyAmount"] = self.FrequecyAmount as AnyObject?
    someDict["insideCabinets"] = self.insideCabinets as AnyObject?
    someDict["insideFridge"] = self.insideFridge as AnyObject?
    someDict["insideOven"] = self.insideOven  as AnyObject?
    someDict["laundryWash"] = self.laundryWash as AnyObject?
    someDict["interiorWindows"] = self.interiorWindows as AnyObject?
    someDict["FullName"] = self.FullName as AnyObject?
    someDict["SuppliesName"] = self.SuppliesName as AnyObject?
    someDict["SuppliesAmount"] = self.SuppliesAmount as AnyObject?
    someDict["FlatNumber"] = self.FlatNumber as AnyObject?
    someDict["StreetAddress"] = self.StreetAddress as AnyObject?
    someDict["PhoneNumber"] = self.PhoneNumber as AnyObject?
    someDict["EmailAddress"] = self.EmailAddress as AnyObject?

    return someDict as AnyObject
}



這在我的一個項目上工作。

轉至產品 - >計劃 - >編輯計劃。 在左側列中選擇Build,並取消選中“Find implicit dependencies”。但是當你第一次構建項目時,這個標誌應該保持被選中。

資源

這是一個簡單的項目,它將我的一個構建從1分鐘增加到2秒。

在物理設備上,我得到了這些結果。 對於我的一個較大的項目(42個文件),只是從2:36減少到2:20。 然後我添加了:SWIFT_WHOLE_MODULE_OPTIMIZATION = YES將構建設置作為用戶定義的設置。 時間到了下午2點

在模擬器上,我第一次使用的時間是49秒。

轉至產品 - >計劃 - >編輯計劃。 在左側列中選擇Build並取消選中“Find implicit dependencies”。但是當你第一次構建項目時,這個標誌應該保持被選中。

並建立了7秒。

我希望這有幫助。




確保你沒有像let combinedArrays = array1 + array2那樣組合數組。 這裡還有一個已知的類型推斷錯誤,Swift浪費時間試圖找出combinedArrays應該是什麼類型。 相反, [array1, array2].joined()應該工作得很好,編譯速度要快得多。