Ho anche sperimentato 100% + CPU durante la digitazione del codice "semplice". Alcuni piccoli trucchi per rendere più veloce lo swift-parser dal modo in cui strutturi il tuo codice.
Non utilizzare il concatinatore "+" nelle stringhe. Per me questo fa scattare la lentezza molto rapidamente. Ogni nuovo "+" porta il parser a una scansione e deve analizzare il codice ogni volta che aggiungi un nuovo carattere da qualche parte nel corpo della tua funzione.
Invece di:
var str = "This" + String(myArray.count) + " is " + String(someVar)
Usa la sintassi del modello che sembra molto più efficiente da analizzare in modo rapido:
var str = "This \(myArray.count) is \(someVar)"
In questo modo fondamentalmente non noto alcun limite in strlen con le variabili in linea "\ (*)".
Se disponi di calcoli che utilizzano + / * - suddividili in parti più piccole.
Invece di:
var result = pi * 2 * radius
uso:
var result = pi * 2
result *= radius
Potrebbe sembrare meno efficiente, ma lo swift parser è molto più veloce in questo modo. Alcune formule non vengono compilate, se hanno molte operazioni, anche se sono matematicamente corrette.
Se hai dei calcoli complessi, inseriscili in una funzione. In questo modo il parser può analizzarlo una volta e non deve analizzarlo ogni volta che si cambia qualcosa nel corpo della funzione.
Perché se hai un calcolo nel corpo della funzione, in qualche modo il parser rapido lo controlla ogni volta se i tipi, la sintassi ecc. Sono ancora corretti. Se una riga cambia sopra il calcolo, alcune variabili all'interno del calcolo / formula potrebbero essere cambiate. Se lo metti in una funzione esterna, verrà convalidato una volta e swift è felice che sia corretto e non lo analizzi costantemente, il che causa un elevato utilizzo della CPU.
In questo modo sono passato dal 100% ad ogni pressione di un tasto a una CPU bassa durante la digitazione. Ad esempio, queste 3 linee inserite in linea nel corpo della funzione possono portare lo swiftparser a gattonare.
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 )
ma se lo metto in una funzione e lo chiamo più tardi, swiftparser è molto più veloce
// 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 sono ancora molto buggati, ma se segui questi semplici trucchi, la modifica del codice diventa di nuovo accettabile. Preferisco molto swift, poiché elimina i file .he utilizza una sintassi molto più pulita. Ci sono ancora molti tipi di casting necessari come "myVar as AnyObject", ma questo è il male minore rispetto alla complessa struttura e sintassi del progetto Object-C.
Un'altra esperienza, ho provato lo SpriteKit, che è divertente da usare, ma è abbastanza inefficiente se non è necessario ridipingere costantemente a 60 fps. Usare i vecchi CALayer è molto meglio per la CPU se i tuoi "sprite" non cambiano spesso. Se non modifichi il contenuto dei livelli, la CPU è praticamente inattiva, ma se hai un'app SpriteKit in esecuzione in background, la riproduzione video in altre app potrebbe iniziare a balbettare a causa del ciclo di aggiornamento a 60 fps.
A volte xcode mostra strani errori durante la compilazione, quindi aiuta ad andare nel menu "Prodotto> Pulisci" e compilarlo di nuovo, sembra essere un'implementazione difettosa della cache.
Un altro ottimo modo per migliorare l'analisi quando xcode si blocca con il tuo codice è menzionato in un altro post di stackoverflow qui . Fondamentalmente copi tutti i contenuti dal tuo file .swift in un editor esterno, quindi funzione per funzione lo copia indietro e vedi dove si trova il tuo collo di bottiglia. Questo in realtà mi ha aiutato a riportare xcode a una velocità ragionevole, dopo che il mio progetto è impazzito con il 100% della CPU. durante la copia del codice, puoi rifattorizzarlo e cercare di mantenere i corpi delle funzioni brevi e le funzioni / le formule / le espressioni semplici (o divise in più righe).