Swift Xcode 索引冻结或缓慢

Posted

技术标签:

【中文标题】Swift Xcode 索引冻结或缓慢【英文标题】:Swift Xcode Index Freezing or Slow 【发布时间】:2014-12-17 02:43:46 【问题描述】:

也许这只是我遇到了这样一个烦人的“功能”:

从 Xcode 6.0.1 升级到 Xcode 6.1 后,情况发生了变化。 Xcode 6.1 一直在为项目编制索引或编译源文件。这个项目不是一个大项目。它只在工作区中包含一堆 Swift 文件和 AWS SDK 2.0 Cocoapods。我认为它不应该阻止整个索引和顺利编译。我尝试了一些 aws-sdk-ios-samples,只是想看看 Xcode 6.1 是如何在它们上工作的,结果却一直在等待。

到目前为止我尝试了哪些解决方案:

    删除管理器中的“派生数据”,然后重新打开工作区。 (无法修复) .xcodeproj 文件上的“显示包内容”并删除 .xcworkspace,如 (Xcode 4 - slow performance)

不幸的是,它们都不起作用。

附:也许我应该尝试重新创建项目? 我的电脑设置: MacBook Pro(Retina,13 英寸,2014 年中),内存 8 GB 1600 MHz DDR3,带有 Yosemite。 (我认为这足以运行这个小项目。)

【问题讨论】:

类似的经历?是的:Xcode beta 3 Swift indexing forever 我不会有太大帮助,但我所做的是......我只是让 xcode 6.x 慢慢来。如果我与之抗争,它会让我大吃一惊,所以我只能等到 xcode 6 启动。我让它运行它是愚蠢的索引。然后我单独启动 iOS 模拟器,等到它的愚蠢跳板出现。最后,当我运行一个项目时,我忽略了一个事实,即索引多次显示“暂停”,我向 祈祷,喝咖啡并尝试进入禅宗模式。但是 *sigh*,这很粗糙 :/ 我真的很喜欢 xcode 5.1.1 :| 这个答案对我有用:***.com/a/33395844/242933 【参考方案1】:

升级到 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版本中多次收到以下错误而得到的 “表达式太复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式。”

希望对你有帮助

【讨论】:

是的,谢谢,我实际上接受了这种建议。而且我还将我的一个文件的长度从 1500 行缩减到了大约 1200 行。当然,我创建了一个新项目并将所有文件一一导入。然后终于又恢复了。不确定哪一个是终极救星。 在 Swift 中拆分长表达式对我有用。【参考方案2】:

最后,我“解决”了这个问题,尽管它只是一种解决方法。

我创建了另一个项目并一个一个地添加了文件。然后我发现了一个“很长”的 viewcontroller.swift 文件。然后我把它的代码分解成模块,把那些重复使用的代码变成另一个 swift 文件中的函数。而且,我在网上接受了建议,长的表达应该被分解成更短的。然后,索引工作和编译工作。

所以现在,我已经“解决”了它。

但是,我认为这是不对的。 Xcode IDE 应该能够处理我的“非常长”的 swift 文件,只有 1500 行。我相信这绝对是一个错误(存在很长时间),虽然 Xcode 6.1 已经是 Xcode 6.0.1 的升级版。

【讨论】:

【参考方案3】:

我也遇到过同样的问题。我已经尝试了提到的两种解决方案(删除派生数据和删除 .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 成功索引。 我忘了说这只是一个临时解决方案,我不得不在几个小时后再次这样做。【参考方案4】:

我也遇到过这个问题,并通过使用“+”运算符删除/更改表达式来解决它。

我改变了这个:

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

到这里:

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

它解决了这个问题。

我的机器是 2013 年底的最大 MBP

【讨论】:

正是我的经验。它挂在完美的 Swift 代码中,修复它的唯一方法是更改​​代码。【参考方案5】:

对我来说,我删除了 Xcode 应用程序并再次下载并安装它。这解决了这个问题,至少现在是这样。

【讨论】:

【参考方案6】:

Xcode 6.2 测试版为我解决了这个问题。不是闪电般快速,但至少它不会永远索引。测试版不会安装在常规 Xcode 安装之上,因此如果您不喜欢该测试版,可以将其删除。

Various Xcode downloads including the beta >

【讨论】:

【参考方案7】:

您可能希望更新到 Xcode 6.1.1

它已经正式发布并为我们解决了索引问题。在更新描述中,它说他们已经应用了稳定性修复,因此它很可能会以更稳定的方式运行。

【讨论】:

有趣。对我来说,6.1.1 引入了无休止的索引问题,一个在 6.1 中可以正常打开的项目。 签名 我明白了。在我们的例子中,我们还使用扩展类简化了表达式并减少了类大小。我们必须这样做是非常荒谬的,但这是我们必须做的。它现在似乎正在奏效。此外,通过注释行,我们根据 Swift 编译器的想法缩小了代码实际上“过于复杂”的范围,并尽可能降低了复杂性。希望他们能尽快解决这个问题,因为它很烦人。【参考方案8】:

如果您不介意在他们弄清楚之前恢复到 6.0.1,那么这对我有用。我在 6.1 和 6.1.1 上都遇到了同样的问题。现在我很好。 6.2出来的时候我试试。

您可以在他们的官方开发网站上找到以前版本的苹果软件,这里是: https://developer.apple.com/downloads/index.action

如果您这样做,请确保首先删除您当前的 Xcode 副本。

【讨论】:

【参考方案9】:

我尝试了上面的许多建议,包括拆分文件、安装 Xcode 6.2 beta 和破坏字符串连接语句。最终为我做的是将用于测试数据的字典文字声明数组拆分为多个 .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 个条目是导致问题的原因;五个就可以了。

【讨论】:

同样的解决方案适用于我的字典。直接初始化它会导致永远运行的索引。逐步在init() 中初始化它确实可以完美运行。值得一提的是,我也不得不删除 .xcworkspace 文件。 为我修复了它,不涉及任何字典。只是一个元组数组,声明中包含 8 个元素。必须恢复到附加 11 个元素。无需费心寻找确切的断点,但构建速度提高了 10 倍。 Mavericks 上的 Xcode 版本 6.1.1 (6A2008a)。 我也正好用 6 个元素解决了这个问题。 5 很好。 这是 XCode 问题还是编译器问题? 我在 Xcode 7.3 中使用 229 项的数组文字体验了这一点。我没有分解它,而是添加了一个类型声明,而不是让 Swift 推断类型。在我这样做之后,它起作用了。【参考方案10】:

你在使用 CocoaPods 吗?我今天早些时候遇到了同样的问题。 (使用 xCode 6.1.1)

为了解决这个问题,我删除了 ~/Library/Developer/Xcode/DerivedData、我的项目目录中的 Pods 文件夹和 <project>.xcworkspace 中的所有内容。

然后我打开终端,导航到我的项目目录,然后再次运行pod install

【讨论】:

是的,我愿意。目前 Xcode 表现良好。但它仍然不时给出sourcekit崩溃错误。我的解决方案是删除派生数据文件夹。 很高兴看到这对其他人也有效:)。似乎 xCode 正在尝试索引 CocoaPod 库并卡在某个地方。 删除 Pods 文件夹和 .xcworkspace 文件,然后再次运行 pod install 有效。【参考方案11】:

我在同一台 MacBook Pro 上使用带有 swift 文件的 Xcode 6.1.1。

当我不断向 3D 字符串数组中添加行时,Xcode 突然变得无法使用,现在我什么也做不了。

将尝试恢复到 6.1,希望问题会消失。

【讨论】:

我也有同样的问题。添加字典数组后,xcode 变得无法使用...您找到解决方案了吗? 我回到了工作得更好的 Xcode 6.1。它并没有永远停留在索引上,但有时我会打字并拿到沙滩球 4 秒钟。总的来说,我能够编写足够多的代码来完成工作。我没有更改任何代码。虽然在 Xcode 6.1 上 macbook pro 的电池似乎并没有受到太大影响,但在我 2013 年中期运行 6.1.1 的 macbook air 上,电池寿命绝对是短命。一旦我启动 Xcode,它会从大约 12 小时变为 2 小时。【参考方案12】:

在我的 Xcode 上,解决方案是关闭所有多余的窗口。出于某种原因,许多打开的窗口使 Xcode 变得非常慢。

【讨论】:

对我来说这也是解决方案,令人惊讶的是它在打开相同数量的窗口之前运行良好很长时间【参考方案13】:

对我来说唯一可行的解​​决方案是删除所有派生数据(不仅针对当前项目,只需清理整个文件夹),然后重新启动 Xcode。

    在 Xcode 中打开文件/首选项

    点击弹出窗口最右侧的位置

    单击“/Users/Mac/Library/Developer/Xcode/DerivedData”旁边的小箭头图标...。它会将您带到包含 DerivedData 文件夹(包含所有从您以前的项目中获得的数据。)

    删除 DerivedData 文件夹

【讨论】:

@TravisM。您是否按照步骤操作?如果您转到窗口、管理器、项目、删除派生数据,它将不起作用。您需要通过首选项。 @ericgu 是的,但它没有用。不过,我确实解决了我的问题,这与我一次性使用硬编码数据初始化字典有关。当我移动代码以一次添加一行硬编码数据时,冻结/缓慢问题立即消失。 我机器上 ~/Library/Developer/Xcode/DerivedData/ 的文件夹。你也可以通过 Xcode 中的 Window > Projects 找到它。 谢谢。这有帮助。 “永久索引”问题在我更新我的 cocoaPod 版本并执行 pod 安装后立即开始。【参考方案14】:

对我来说,我尝试了以上所有方法都没有成功;但我所要做的就是删除派生的数据文件夹,然后打开另一个随机项目,等待它建立索引,现在我的原始(故障)项目可以工作了!

帮助开发世界,让你的 swift 编译器开源——这样我们就不会因为你的无能而受挫。

【讨论】:

【参考方案15】:

今天遇到了同样的问题。 Xcode 6.3.2,中型 Swift 项目。在某一时刻,它开始索引并且永远不会完成索引。导致这种情况的代码是一个 [String:[String]] 类型的字典,因此是一个以字符串数组作为值的字符串键字典。我有两个从 A 到 Z 的键,这 26 个条目中的每一个都包含一个包含 5 到 10 个字符串的字符串数组。

清除派生数据没有帮助。只有注释掉那些 dicts 才能让它再次运行。

老实说,这太荒谬了!苹果需要修复 Xcode!编译 Swift 项目时它已经非常慢了,但是像这样的错误是个大问题。我不能用这个正确地完成我的工作!

【讨论】:

【参考方案16】:

我在 Xcode 6.3.2 中看到了这一点。我真的希望在发布一年后,他们会让编译器工作,但是唉。

如果上述解决方案都不适用,请尝试检查您的代码是否存在语法错误。在重构的过程中,我提取了一个闭包却忘记了限定参数:

    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 工作中学到了什么,那就是渐进式地工作,以避免为了找到有问题的代码而不得不回溯太多。

【讨论】:

【参考方案17】:

对于那些仍然有这个问题的人,这是我喜欢的一种解决方法,它可以让您不必逐个输入对象:

// 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])

【讨论】:

哇...我遇到了完全相同的问题。谢谢!我将其作为错误报告给 Apple。照你说的做对我没有用。我不得不将我的长数组分解成更小的数组,每个数组包含五个或更少的元素。【参考方案18】:

我正在使用 Xcode 版本 7.3 (7D175)

我想我可能已经发现了一个潜在的问题。有两个我陷入索引阶段的情况:

我创建了一个分配给变量的闭包并省略了类型签名。我认为 xcode 在该类型推断步骤方面存在问题。如果我没记错的话,其中一个参数是一个 CGPoint,它有一个重载的构造函数。我的假设是,我的闭包可能接受的参数太多。

我重构了一个工厂方法,这样它就可以返回具有公共基类的多种类型的实例,而不是返回一种类型的实例。看来,无论我在哪里使用工厂方法,我都必须将结果对象转换为特定类型(使用 as? 或通过将其分配给接受特定类型的变量)再次类型推断步骤似乎被破坏了。

似乎前面的人提到的字典声明也是如此。我向苹果提交了错误报告。

【讨论】:

【参考方案19】:
    您的索引状态是“指示圈”还是“进度条”? 如果是“指标圈”,说明一开始就卡住了。 打开并检查您的其他项目,如果它们都相同,则表示这是系统问题。 只需重新启动计算机,一切都会好起来的。

【讨论】:

【参考方案20】:

Xcode 索引通常为您的代码提供建议和自动完成功能,例如在故事板中帮助您,反之亦然。 但是为了使您的 xcode 项目更快,您可以通过终端将其关闭/打开

关闭索引 默认写入 com.apple.dt.XCode IDEIndexDisable 1 开启索引 默认写入 com.apple.dt.XCode IDEIndexDisable 0

但更好的方法是使用具有良好 RAM 的快速 mac。

【讨论】:

关闭索引会严重削弱 Xcode,不应该这样做。告诉某人购买一台新 Mac 永远不是答案,一台 2 年的笔记本电脑应该能够处理最新的 Xcode。 macOS 10.13 Beta 7 引入了一些东西,一旦索引器运行,Xcode 9 Beta 6 和 Xcode 8 就会崩溃。关闭它是继续使用 Xcode 的唯一方法,即使是残缺版本。【参考方案21】:

我使用 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 推断复杂的结构。

【讨论】:

【参考方案22】:

我遇到了同样的问题。我的 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)

【讨论】:

【参考方案23】:

我已经用 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 之后)。一行一行地取消注释。有一些行很好,然后取消注释下一行会使其挂起。

唯一有帮助的显然是更改您的代码。

【讨论】:

【参考方案24】:

我有这样的表达:

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

还有

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

所以重点是重写您的文件以仅包含幼儿园级别的表达式,这样索引问题就会消失。

【讨论】:

【参考方案25】:

Xcode 11.5 (11E608c) 仍然是同样的问题,在最初的问题之后 6 年。 我希望我可以在这个问题中“标记”苹果,这样他们就可以看到这个烂摊子。 这是一个大型项目(>1000 个文件),我在时钟下,所以当我注意到冻结索引时,我更改了 100 多个文件并且无法返回。

我什么都试过了:

    清除派生数据并构建 重启xcode,重启mac 删除和添加源 搜索字典文字等

问题是创建数组:

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")]

帮助我发现坏的 swift 文件是当 xcode 冻结索引时,我执行了以下步骤

    打开活动监视器->“swift”进程->显示进程信息->打开文件和端口。这将为您提供此进程正在运行的文件的列表,深入了解您的可能坏文件列表 其他方便的工具是这个脚本SOURCEKIT_LOGGING=3 /Applications/Xcode.app/Contents/MacOS/Xcode &amp;&gt; ~/Documents/xcode.log,它将以 3 级详细启动 Xcode 并开始记录日志文件。 在日志文件中搜索您的 swift 文件的最后条目,例如: “my_project/Source/App/”

这不是一个完整的解决方案,但有助于深入了解并知道在哪里查看。

【讨论】:

以上是关于Swift Xcode 索引冻结或缓慢的主要内容,如果未能解决你的问题,请参考以下文章

调试运行缓慢的 ASP.NET 网站?

如何解决SQL Server查询速度缓慢的问题

由于“检查依赖项”,在 XCode4 上构建缓慢

UICollectionView 滚动 SWIFT 滞后/缓慢

为啥在模拟器中启动应用程序后 xcode 控制台输出缓慢?

通过 instantiateWithOwner 在 swift2 中缓慢加载笔尖