2016-09-17 26 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简单:-)