Swift Xcode索引冻结或缓慢


101

也许这就是我正在经历的如此烦人的“功能”:

从Xcode 6.0.1升级到Xcode 6.1之后,情况发生了变化。Xcode 6.1永远索引项目或编译源文件。这个项目不是一个大项目。它仅在工作区中包含一堆Swift文件和AWS开发工具包2.0 Cocoapods。我认为这不应该阻止整体顺利索引和编译。我尝试了一些aws-sdk-ios-samples,只是为了了解Xcode 6.1在它们上的工作方式,并且最终导致了同样的等待。

到目前为止,我尝试过什么解决方案:

  1. 在管理器中删除“派生数据”,然后重新打开和工作区。(修复失败)
  2. 在.xcodeproj文件上“显示程序包内容”,并删除(xcode 4-慢速性能)中的.xcworkspace

不幸的是,他们都没有工作。

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



2
我不会有太大帮助,但是我要做的是...我只是让xcode 6.x抽空了。如果我与之抗争,那将花费我很多时间,所以我只是等到xcode 6开始。我让它运行它是愚蠢的索引。然后,我分别启动iOS模拟器,然后等待它显示出愚蠢的跳板。最终,当我运行一个项目时,我忽略了一个事实,即索引多次说“已暂停”,我祈祷<#godObject#>,喝咖啡,然后尝试进入禅宗模式。但是,*叹*,这很粗糙:/,我真的很喜欢xcode 5.1.1:|
staticVoidMan 2014年

这个答案对我
有用

Answers:


72

我尝试了以上许多建议,包括拆分文件,安装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文件。
jboi 2014年

在没有字典的情况下为我修复了该问题。只是一个元组数组,可以在声明中包含8个元素。必须还原为带有11个元素的追加。并没有费心找到确切的断点,但是构建速度提高了10倍。Mavericks上的Xcode版本6.1.1(6A2008a)。
2015年

我也用6个要素来解决这个问题。5很好。
贾斯汀·刘

这是XCode问题还是编译器问题?
Sljux

4
我在Xcode 7.3中经历了229个项目的数组文字。我没有拆分它,而是添加了一个类型声明,而不是让Swift推断类型。我这样做之后,它就起作用了。
百翰

34

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

  1. 在Xcode中打开文件/首选项

  2. 单击弹出窗口最右侧的位置

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

  4. 删除DerivedData文件夹


1
@TravisM。您遵循步骤了吗?如果转到“窗口”,“组织者”,“项目”,“删除派生数据”,它将无法正常工作。您需要通过首选项。
ericgu 2015年

@ericgu是的,但是没有用。我确实解决了这个问题,但是这与我用一枪初始化带有硬编码数据的字典有关。当我移动代码以一次添加一行硬编码数据时,冻结/缓慢问题立即消失了。
Travis M.

我计算机上〜/ Library / Developer / Xcode / DerivedData /中的文件夹。您也可以通过在Xcode中转到“窗口”>“项目”来找到它。
Suragch '16

谢谢。这会有所帮助。我更新了cocoaPod版本并执行了pod安装后,“永远索引”问题就开始了。
WKL

11

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

要解决这个问题,我删除了一切~/Library/Developer/Xcode/DerivedData,将Pods在我的项目目录文件夹,和<project>.xcworkspace

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


1
是的,我愿意。目前,Xcode表现良好。但是它仍然不时地给Sourcekit崩溃报错。我的解决方案是删除派生的数据文件夹。
伦纳德2015年

很高兴看到这也适用于其他人:)。好像xCode试图索引CocoaPod库并卡在某个地方。
Michael Schinis,2015年

1
删除Pods文件夹和<project> .xcworkspace文件,然后再次运行pod install即可。
KML 2015年

9

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

清除派生数据无济于事。只注释掉那些命令才使它再次生效。

老实说,这太荒谬了!苹果需要修复Xcode!编译Swift项目时,它已经非常慢了,但是像这样的bug却是问题。我不能用这个来做好我的工作!


6

对于那些仍然遇到此问题的人,这是我逐渐喜欢的一种变通方法,它可以防止您不得不一个个地输入对象:

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

1
哇...我有完全一样的问题。谢谢!我向苹果报告它是一个错误。照你说的做对我没有用。我不得不将我的长数组分解为较小的数组,每个数组包含五个或更少的元素。
ma11hew28'2013/

5

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

使开发世界成为一个宠儿,并让您的快速编译器开源—因此,您的能力不足,我们并不会因此而受挫。


3

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

我想我可能已经发现了一个潜在的问题。在两个实例中,我陷入了索引阶段:

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

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

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


2

升级到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行。当然,我创建了一个新项目,并将所有文件一个接一个地导入到其中。然后终于恢复了。不太确定哪一个是最终的救星。
伦纳德2014年

在Swift中拆分一个长表达式对我有用。
MandisaW

2

我一直在努力解决同样的问题。我尝试了提到的两个解决方案(删除派生数据和删除.xcworkspace)都没有成功。我还尝试慢慢一点一点地注释掉大部分代码,并删除文件,直到几乎没有剩余并且索引仍然卡住。

我确实找到了一个对我有用的解决方案,我用一个较旧的Xcode版本6.1(6A1030)打开了该项目,该版本没有索引问题,然后又回到了以前使用的最新Xcode版本6.1(6A1052d),索引已固定并继续运行良好。

我的结论是,这是Xcode 6.1(6A1052d)的错误,我希望将来的发行版中会有所改善。

该问题有时会再次出现,每次都可以使用相同的修复程序。我想另一种解决方案是仅坚持使用较旧的Xcode版本6.1(6A1030),但它不能与运行iOS 8.1的设备一起使用,并且不会提供最新的错误修复。


我尝试了解决永久索引问题的大多数建议,这是唯一对我有用的建议。我没有较旧的Xcode 6,但是有Xcode5。它无法构建,但是可以索引,并且在成功对Xcode 6.1进行索引之后。
SarahR 2014年

我忘了提到这只是一个临时解决方案,数小时后我不得不再次这样做。
SarahR 2014年

2

我已经尝试过使用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之后)。另一行未注释。对于一些行,它很好,然后取消注释下一行将使其挂起。

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


2

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


对我来说,这也是解决方案,令人惊讶,因为在打开相同数量的窗口之前,它在很长一段时间
Christian

1

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

我创建了另一个项目,并一个接一个地添加了文件。然后我发现了一个“非常长的” viewcontroller.swift文件。然后,我将其代码分解为模块,并将那些重复使用的代码转换为另一个swift文件中的函数。另外,我在网上提出了一个建议,即长表达应分解为较短的表达。然后,索引工作和编译工作。

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

但是,我认为这是不对的。Xcode IDE应该能够处理我的“非常长”的swift文件,仅1500行。我相信这绝对是一个bug(已经存在很长时间了),尽管Xcode 6.1已经是Xcode 6.0.1的升级。


1

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


1

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

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

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


2
关闭索引会严重破坏Xcode,因此不应这样做。告诉别人购买新的Mac绝不是答案,使用2年的笔记本电脑应该能够处理最新的Xcode。
Knight0fDragon

macOS 10.13 Beta 7引入了一些东西,一旦索引器运行,它就会使Xcode 9 Beta 6和Xcode 8崩溃。即使是残缺的版本,关闭它也是继续使用Xcode的唯一方法。
Pegolon

0

如果您不介意恢复到6.0.1,直到他们弄清楚了,那对我有用。我在6.1和6.1.1上都有相同的问题。现在我很好。我会尝试6.2。

您可以在其官方开发站点上找到Apple软件的早期版本,网址为:https : //developer.apple.com/downloads/index.action

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


0

我在完全相同的MacBook Pro上使用带有快速文件的Xcode 6.1.1。

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

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


我有同样的问题。添加字典数组后,xcode变得不可用...找到解决方案了吗?
Almazini 2015年

我回到了性能更好的Xcode 6.1。它不会永远停留在索引上,但有时我会打字并拿到沙滩球4秒钟。总的来说,我能够编写足够的代码来完成工作。我没有更改任何代码。尽管在Xcode 6.1上,macbook pro的电池似乎并没有受到太大影响,但是在运行6.1.1的我的macbook air 2013年中期中,电池寿命绝对可以断断续续。启动Xcode后,它从〜12个小时变为剩下2个小时。
gardner888

0

我在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中学到了什么,它就是逐步工作,以避免不得不回溯太多才能找到有问题的代码。


0
  1. 您的索引编制状态是“指标圈”还是“进度条”?
  2. 如果它是一个“指标圈”,则表示它已卡在开头。
  3. 打开并检查您的其他项目(如果它们都相同),这是系统问题。
  4. 只需重新启动计算机,一切都会好起来的。

0

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


0

我有同样的问题。我的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)
}

0

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

我改变了这个:

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

对此:

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

它解决了问题。

我的机器在2013年末MBP已用尽


正是我的经验。它与完美的Swift代码一起挂起,并且解决它的唯一方法是更改​​代码。
gnasher729

0

您可能希望更新到Xcode 6.1.1

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


7
有趣。对我来说,6.1.1 引入了无尽的索引问题,该项目在6.1中很好地打开了。标志
Pascal Bourque 2014年

我懂了。在我们的案例中,我们还使用扩展类简化了表达式并减小了类的大小。我们不得不这样做,这很荒谬,但这是我们必须要做的。现在看来,这就是窍门。同样通过注释掉行,我们根据Swift编译器的想法缩小了代码的实际“过于复杂”的范围,并尽可能降低了复杂性。希望他们会尽快解决此问题,因为这很烦人。
Angel Naydenov 2014年

0

Xcode 6.2 beta为我解决了这个问题。不快如闪电,但至少它不会永远索引。该测试版并没有安装在你的定期Xcode的安装的顶部,所以如果你不喜欢的测试,你可以将其删除。

各种Xcode下载,包括beta>


0

我有这样的表达:

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

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

因此,重点是重写文件以仅包含幼儿园级别的表达式,索引问题将消失。


0

Xcode 11.5(11E608c)仍然是相同的问题,距最初提出问题已有6年了。我希望我可以在这个问题上“标记”苹果,以便他们可以看到这个烂摊子。这是一个很大的项目(> 1000个文件),我不知所措,所以当我发现冻结索引时,我更改了100多个文件,无法返回。

我已经尝试了一切:

  1. 清除衍生数据并构建
  2. 重新启动xcode,重新启动mac
  3. 删除并添加源
  4. 搜索字典文字等

问题是数组创建:

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冻结索引时,我执行了以下步骤

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

这不是一个完整的解决方案,但有助于深入了解并知道要查找的位置。

打开活动监视器->“快速”过程->显示过程信息->打开文件和端口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.