Eu também experimentei 100% + CPU enquanto digitava algum código "simples". Alguns pequenos truques para tornar o analisador rápido mais rápido pela maneira como você estrutura seu código.
Não use o concatinador "+" em strings. Para mim, isso desencadeia a lentidão muito rapidamente. Cada novo "+" traz o analisador para um rastreamento, e ele tem que reanalisar o código toda vez que você adiciona um novo caractere em algum lugar do corpo da função.
Ao invés de:
var str = "This" + String(myArray.count) + " is " + String(someVar)
Use a sintaxe do modelo, que parece muito mais eficiente para analisar rapidamente:
var str = "This \(myArray.count) is \(someVar)"
Desta forma, eu basicamente noto nenhum limite em strlen com vars inline "\ (*)".
Se você tiver cálculos, que usam + / * -, divida-os em partes menores.
Ao invés de:
var result = pi * 2 * radius
usar:
var result = pi * 2
result *= radius
Pode parecer menos eficiente, mas o analisador rápido é muito mais rápido dessa forma. Algumas fórmulas não compilarão, se tiverem de muitas operações, mesmo se forem matematicamente corretas.
Se você tiver alguns cálculos complexos, coloque-os em uma função. Dessa forma, o analisador pode analisá-lo uma vez e não precisa analisá-lo novamente toda vez que você alterar algo no corpo da função.
Porque se você tem um cálculo no corpo da função, de alguma forma o analisador rápido verifica se os tipos, sintaxe etc. ainda estão corretos. Se uma linha mudar acima do cálculo, algumas variáveis dentro de seu cálculo / fórmula podem ter mudado. Se você colocá-lo em uma função externa, ele será validado uma vez e o swift fica feliz por estar correto e não o repassa constantemente, o que está causando o alto uso da CPU.
Dessa forma, passei de 100% a cada pressionamento de tecla para uma CPU baixa durante a digitação. Por exemplo, essas 3 linhas inseridas em linha no corpo da função podem trazer o analisador rápido para um rastreamento.
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 )
mas se eu colocá-lo em uma função e chamá-lo mais tarde, o swiftparser é muito mais rápido
// 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)
}
Swift e XCode 6.1 ainda apresentam muitos bugs, mas se você seguir esses truques simples, a edição de código se torna aceitável novamente. Eu prefiro muito o swift, pois ele elimina os arquivos .h e usa uma sintaxe muito mais limpa. Ainda há muitos tipos de conversão necessários como "myVar as AnyObject", mas esse é o mal menor em comparação com a estrutura e sintaxe de projeto object-c complexas.
Outra experiência, experimentei o SpriteKit, que é divertido de usar, mas é bastante ineficiente se você não precisa de uma repintura constante a 60fps. Usar CALayers antigos é muito melhor para a CPU se seus "sprites" não mudarem com tanta frequência. Se você não alterar o conteúdo das camadas, a CPU ficará basicamente ociosa, mas se você tiver um aplicativo SpriteKit em execução em segundo plano, o videoplayback em outros aplicativos pode começar a falhar devido ao loop de atualização de 60fps limitado.
Às vezes, o xcode mostra erros estranhos durante a compilação, então ajuda ir ao menu "Produto> Limpar" e compilá-lo novamente, parece ser uma implementação com bugs do cache.
Outra ótima maneira de melhorar a análise quando o xcode fica preso em seu código é mencionada em outra postagem do stackoverflow aqui . Basicamente, você copia todo o conteúdo de seu arquivo .swift para um editor externo e, em seguida, função por função, copia-o de volta e vê onde está o gargalo. Isso realmente me ajudou a colocar o xcode em uma velocidade razoável novamente, depois que meu projeto enlouqueceu com 100% de CPU. enquanto copia seu código de volta, você pode refatorá-lo e tentar manter seus corpos de função curtos e funções / formulários / expressões simples (ou divididos em várias linhas).