Xcode 8.0 Swift 3.0缓慢索引和构建

时间:2016-09-17 13:09:00

标签: ios xcode indexing swift3 xcode8

我已经安装了Xcode 8.0并将Swift 2.2转换为3.0(这个过程也花费了很多时间,我只是让我的Mac一整夜都在运行)。我没有一个大项目(大约20个文件)。我也在使用DerivedData。索引以前的Xcode版本(< 8.0)工作得很快,但现在,升级后,进度条停留在一个位置(我已经等了一个小时)。

我尝试过的对我没有帮助的事情:

  • 清除Pods文件夹并重新启动Xcode
  • 清理项目并重新启动Xcode
  • 删除<project>.xcworkspace目录htonl,然后重新安装
  • 重启Mac
  • 尝试没有Pods的构建项目
  • 重新安装Xcode
  • 尝试使用克隆项目的另一台Mac

当开发人员花费数小时来解决这些荒谬的问题时,制作这样的软件版本真的不是很酷。这非常令人失望。 任何想法如何解决这个问题?

16 个答案:

答案 0 :(得分:51)

转到项目设置,然后转到编辑器&gt;添加构建设置&gt;添加用户定义的设置,并添加以下内容:

private void drawCenteredCircle(Graphics g, int x, int y, int radius) {
    Graphics2D g2 = (Graphics2D) g.create();
    g2.setColor(pointColor);
    g2.fill(new Ellipse2D.Float(x-radius, y-radius, 2*radius, 2*radius);
    g2.dispose();
}

添加此标志会将我们的清理构建编译时间从7分钟下降到65秒,这对于40KLOC swift项目来说是奇迹般的。也可以确认2位朋友在企业项目上看到了类似的改进。

我只能假设这是Xcode 8.0中的某种错误

答案 1 :(得分: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)
    }
}

答案 2 :(得分:6)

自从升级到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"]

答案 3 :(得分:5)

我遇到了类似问题并按照本指南进行调试:http://irace.me/swift-profiling 我的问题是我在某些字符串中使用了nil coalescing运算符,例如:

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

这四种方法造成2分钟的建筑时间。

答案 4 :(得分:5)

我有同样的问题并通过逐行仔细检查我的代码来解决它,结果是Swift 3更喜欢字符串插值而不是使用+符号,即

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

如果您一直使用上述代码风格,请将其替换为;

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

您的构建时间将立即恢复正常。

答案 5 :(得分:3)

对于那些想要找到编译器被“捕获”的人

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

检查完整答案here

答案 6 :(得分:2)

我尝试了上述解决方案,但问题仍然存在。调试工作也很奇怪。经过几天的研究,我找到了下面的解决方案。

选择主要目标&gt;构建设置。配置如下图。

enter image description here

答案 7 :(得分:1)

我遇到了相同的索引问题,但只有当我在设备上运行/调试然后切换到左上角工具栏上的另一台设备(目标&gt; iPhone)时才会发生。

上述解决方案均不适合我。

我的解决方案:我删除了我当地的git工作副本,并从我的原始版本克隆了一个新版本。

(xcuserdata / shared / session等文件夹中有一些&#39; magic&#39;文件可能导致此问题?)

答案 8 :(得分:1)

不是说我认为这与OP的问题有关,但最近我的XCode 8已经放慢了速度。我最终发现这是我的错(我记得无意中这样做了) - 我添加了XCode.app作为框架参考。这实际上使XCode搜索并索引整个XCode.app文件夹。一旦我看到错误并删除框架,它再次变好了:)

答案 9 :(得分: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次之后,编译时间从一分钟缩短到几毫秒。

在其他地方将类型感染和数学结合起来也很可能会出现这个问题,所以请确保代码中的任何其他地方都不会发生这种情况。

答案 10 :(得分: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

答案 11 :(得分:0)

添加设置后,

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

我们的项目清理 - 编译时间从1200s到180s,650个swift文件。但这会导致编译失败。当增加编译只需要60s

时,每次更改都需要180s才能编译

答案 12 :(得分:0)

这是一个Xcode错误(Xcode 8.2.1),当你有一个大字典文字或嵌套字典文字时会发生这种错误。您必须将字典拆分为较小的部分,并使用append方法添加它们,直到Apple修复该错误。

答案 13 :(得分:0)

这适用于Xcode 8.2.1和Swift 3,当&#34;索引&#34;卡住了:

我总是打开两个项目,一个虚拟项目和我正在进行的项目。我还连接了一台iPad Air设备,我可以运行我的项目。当我的项目停留在&#34;索引&#34;时,我切换到我的虚拟项目并在我连接的iPad Air设备上运行我的项目。然后我停止了这个项目 并切换回我正在进行的项目和#34;索引&#34;神奇地完成了。如果您没有连接物理设备,这也应仅适用于模拟器。

答案 14 :(得分:0)

我遇到了类似的问题,并开发了自己的实用程序 ? Rugby。 在当前版本中,Rugby 可以缓存所有远程 Pod 依赖项并从 Pods 项目中删除它们的目标。\

在幕后,它正在使用一些优化。例如,像 SWIFT_COMPILATION_MODE=wholemodule

答案 15 :(得分:-1)

解决这个问题的方法是使用键来设置字典值

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

如果你有一个很长的字典,它可能会或可能不会导致编译循环,导致构建时间过长。任何超过8个键的东西都应该设置。