J'ai également expérimenté 100% + CPU en tapant du code "simple". Quelques petites astuces pour accélérer l'analyseur rapide par la façon dont vous structurez votre code.
N'utilisez pas le concatinateur "+" dans les chaînes. Pour moi, cela déclenche la lenteur très rapidement. Chaque nouveau "+" amène l'analyseur à une analyse, et il doit analyser le code chaque fois que vous ajoutez un nouveau caractère quelque part dans le corps de votre fonction.
Au lieu de:
var str = "This" + String(myArray.count) + " is " + String(someVar)
Utilisez la syntaxe template qui semble beaucoup plus efficace à analyser en swift:
var str = "This \(myArray.count) is \(someVar)"
De cette façon, je ne remarque essentiellement aucune limite dans strlen avec les variables en ligne "\ (*)".
Si vous avez des calculs utilisant + / * -, divisez-les en parties plus petites.
Au lieu de:
var result = pi * 2 * radius
utilisation:
var result = pi * 2
result *= radius
Cela peut sembler moins efficace, mais l'analyseur rapide est beaucoup plus rapide de cette façon. Certaines formules ne se compilent pas, si elles ont trop d'opérations, même si elles sont mathématiquement correctes.
Si vous avez des calculs complexes, mettez-les dans un func. De cette façon, l'analyseur peut l'analyser une fois et n'a pas besoin de le réanalyser chaque fois que vous modifiez quelque chose dans votre corps de fonction.
Parce que si vous avez un calcul dans le corps de votre fonction, l'analyseur rapide le vérifie à chaque fois si les types, la syntaxe, etc. sont toujours corrects. Si une ligne change au-dessus du calcul, il se peut que certaines variables de votre calcul / formule aient changé. Si vous le placez dans une fonction externe, il sera validé une fois et Swift est heureux qu'il soit correct et ne le répète pas constamment, ce qui entraîne une utilisation élevée du processeur.
De cette façon, je suis passé de 100% à chaque pression de touche à un processeur faible en tapant. Par exemple, ces 3 lignes mises en ligne dans votre corps de fonction peuvent amener le swiftparser à une analyse.
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 )
mais si je le mets dans un func et que je l'appelle plus tard, swiftparser est beaucoup plus rapide
// 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 et XCode 6.1 sont toujours très bogués, mais si vous suivez ces astuces simples, l'édition de code redevient acceptable. Je préfère beaucoup swift, car il supprime les fichiers .h et utilise une syntaxe beaucoup plus propre. Il y a encore beaucoup de castes de types nécessaires comme "myVar as AnyObject", mais c'est le plus petit mal comparé à la structure et à la syntaxe complexes du projet objective-c.
Autre expérience également, j'ai essayé le SpriteKit, qui est amusant à utiliser, mais il est assez inefficace si vous n'avez pas besoin de repeindre constamment à 60 ips. L'utilisation d'anciens CALayers est bien meilleure pour le CPU si vos "sprites" ne changent pas souvent. Si vous ne modifiez pas le contenu des couches, le processeur est essentiellement inactif, mais si vous avez une application SpriteKit en arrière-plan, la lecture vidéo dans d'autres applications peut commencer à bégayer en raison de la boucle de mise à jour à 60 ips.
Parfois, xcode montre des erreurs étranges lors de la compilation, puis il aide à aller dans le menu "Produit> Nettoyer" et à le recompiler, semble être une implémentation boguée du cache.
Un autre excellent moyen d'améliorer l'analyse lorsque xcode est bloqué avec votre code est mentionné dans un autre article de stackoverflow ici . Fondamentalement, vous copiez tout le contenu de votre fichier .swift dans un éditeur externe, puis fonction par fonction, copiez-le et voyez où se trouve votre goulot d'étranglement. Cela m'a en fait aidé à ramener xcode à une vitesse raisonnable, après que mon projet soit devenu fou avec 100% de CPU. tout en recopiant votre code, vous pouvez le refactoriser et essayer de garder vos corps de fonctions courts et les fonctions / formulaires / expressions simples (ou divisés en plusieurs lignes).