Xcode 6带有Swift超慢速打字和自动完成功能

mll*_*llm 112 xcode autocomplete ios swift xcode6

当你输入代码时,使用Swift的只是我或Xcode 6(6.0.1)似乎超级慢,特别是在自动完成时?

一个普通的Objective-C类,即使在Swift项目中,它的工作方式几乎和以前一样,所以Swift会杀掉它.

有没有其他人遇到同样的不便?您对如何提高性能有任何想法吗?

  • 我试着玩一些设置,但没有运气.
  • 我当然也试过没有运气重启Xcode和电脑.
  • 没有其他重型应用程序是开放的

我使用的是2009年中期Macbook Pro(2.26 GHz Intel Core 2 Duo),配备8GB RAM和SSD HD,这不是最新的东西,但仍然不是一个完整的垃圾.

很遗憾,因为我很高兴开始使用Swift,现在真的让人无法忍受.

想法/提示?

小智 82

  • 退出Xcode并重新启动Mac不是必需的,但首选.
  • 删除内容的文件夹〜/资源库/开发/的Xcode/DerivedData的
  • 删除内容〜/ Library/Caches/com.apple.dt.Xcode

这是暂时的解决方案,但效果很好.

使用脚本编辑器app在脚本下方.

tell application "Terminal"
    do script "rm -frd ~/Library/Developer/Xcode/DerivedData/*"
    do script "rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"
end tell
Run Code Online (Sandbox Code Playgroud)

或者,您可以为终端创建一个别名,如下所示:

alias xcodeclean="rm -frd ~/Library/Developer/Xcode/DerivedData/* && rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"
Run Code Online (Sandbox Code Playgroud)

您可以将其添加到您的~/.bash_profile,然后xcodeclean每次要清除这两个文件夹时在命令行上键入.


小智 13

键入一些"简单"代码时,我也经历了100%+ CPU.一些小技巧可以通过构造代码的方式使swift-parser更快.

不要在字符串中使用"+"concatinator.对我来说,这很快就会触发缓慢.每个新的"+"都会使解析器进行爬网,并且每次在函数体中的某处添加新的char时都必须重新解析代码.

代替:

var str = "This" + String(myArray.count) + " is " + String(someVar)
Run Code Online (Sandbox Code Playgroud)

使用模板语法,在swift中解析效率似乎更高效:

var str = "This \(myArray.count) is \(someVar)"
Run Code Online (Sandbox Code Playgroud)

这种方式我基本上没有限制strlen与内联变量"\(*)".

如果你有计算,使用+/* - 然后将它们分成更小的部分.

代替:

var result = pi * 2 * radius 
Run Code Online (Sandbox Code Playgroud)

使用:

var result  = pi * 2
    result *= radius
Run Code Online (Sandbox Code Playgroud)

它可能看起来效率较低,但快速解析器的速度要快得多.如果某些公式必须进行多次操作,即使它们在数学上是正确的,也不会编译.

如果你有一些复杂的计算,那么把它放在一个函数中.这样解析器可以解析一次,并且不必在每次更改函数体中的内容时重新解析它.

因为如果你的函数体中有一个计算,那么如果类型,语法等仍然正确,那么swift解析器每次都会检查它.如果一条线在计算之上变化,则计算/公式中的某些变量可能已更改.如果你将它放在一个外部函数中,那么它将被验证一次,并且swift很高兴它将是正确的并且不会不断地重新解析它,这导致高CPU使用率.

这样,我在每次按键时从100%到达低CPU同时输入.例如,在函数体中内联的这3行可以使swiftparser爬行.

let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"
let spacesData  = NSDictionary(contentsOfFile: fullPath )! // as Dictionary<String, AnyObject>
let spaces : AnyObject   = spacesData["SpacesDisplayConfiguration"]!["Management Data"]!!["Monitors"]!![0]["Spaces"]!! 

println ( spaces )
Run Code Online (Sandbox Code Playgroud)

但如果我把它放在一个函数中并稍后调用它,swiftparser会更快

// some crazy typecasting here to silence the parser
// Autodetect of Type from Plist is very rudimentary, 
// so you have to teach swift your types
// i hope this will get improved in swift in future
// would be much easier if one had a xpath filter with
// spacesData.getxpath( "SpacesDisplayConfiguration/Management Data/Monitors/0/Spaces" ) as Array<*> 
// and xcode could detect type from the plist automatically
// maybe somebody can show me a more efficient way to do it
// again to make it nice for the swift parser, many vars and small statements
func getSpacesDataFromPlist() -> Array<Dictionary<String, AnyObject>> {
  let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"

  let spacesData  = NSDictionary(contentsOfFile: fullPath )!    as Dictionary<String, AnyObject>
  let sdconfig    = spacesData["SpacesDisplayConfiguration"]    as Dictionary<String, AnyObject>
  let mandata     = sdconfig["Management Data"]                 as Dictionary<String, AnyObject> 
  let monitors    = mandata["Monitors"]                         as Array<Dictionary<String, AnyObject>> 
  let monitor     = monitors[0]                                 as Dictionary<String, AnyObject>
  let spaces      = monitor["Spaces"]                           as Array<Dictionary<String, AnyObject>>

  return spaces
}

func awakeFromNib() {
  ....
  ... typing here ...

  let spaces = self.getSpacesDataFromPlist()
  println( spaces) 
}
Run Code Online (Sandbox Code Playgroud)

Swift和XCode 6.1仍然非常错误,但如果你遵循这些简单的技巧,编辑代码将再次被接受.我更喜欢快速,因为它摆脱.h文件并使用更清晰的语法.还有许多类型转换需要像"myVar as AnyObject",但与复杂的objective-c项目结构和语法相比,这是更小的邪恶.

还有另一种体验,我尝试了SpriteKit,使用起来很有趣,但是如果你不需要以60fps的恒定重绘效果它非常有效.如果你的"精灵"经常不改变,那么使用旧的CALayers对CPU来说要好得多.如果你没有更改图层的.contents,那么CPU基本上是空闲的,但是如果你有一个在后台运行的SpriteKit应用程序,那么其他应用程序中的videoplayback可能会因为60fps的硬限制更新循环而开始出现断断续续的情况.

有时xcode在编译时显示奇怪的错误,然后它有助于进入菜单"Product> Clean"并再次编译它,似乎是缓存的错误实现.

另一种伟大的方式来改善解析时,你的代码是在另一个计算器帖子中提到的Xcode卡在这里.基本上,您将.swift文件中的所有内容复制到外部编辑器中,然后通过功能将其复制回来,看看您的瓶颈在哪里.在我的项目因100%CPU疯狂之后,这实际上帮助我再次使xcode达到合理的速度.在复制你的代码时,你可以重构它并尝试保持你的函数体简短,函数/公式化/表达式简单(或分成几行).


Spa*_*Dog 10

因为Xcode的4自动完成被打破直到苹果决定来解决这个2岁的错误,唯一的解决办法,可惜,就是把代码完成关闭在Xcode的偏好(以下PIC的第一个选项).

您可以通过键入CTRL spaceESC在需要时手动继续享受完成.

对于100%的案例,这是唯一有效的解决方案.

在此输入图像描述

我最近发现的另一件事是:如果你在Xcode上使用插件,那就不要了.全部删除它们.他们使问题变得更糟.


小智 5

你在使用Spotify吗?我在2009年中期的iMac(2.66Ghz)上安装了Yosemite GM与Xcode 6.1 GM有同样的问题.我发现一个名为"SpotifyWebHelper"的过程总是标记为红色,因为没有响应,所以我禁用了"从网络开始"选项spotify,现在Xcode似乎运行得更好.