Saya juga mengalami 100% + CPU saat mengetik beberapa kode "sederhana". Beberapa trik kecil untuk membuat pengurai cepat lebih cepat dengan cara Anda menyusun kode.
Jangan gunakan concatinator "+" dalam string. Bagi saya ini memicu kelambatan dengan sangat cepat. Setiap "+" baru membawa parser ke crawl, dan kode tersebut harus reparse setiap kali Anda menambahkan karakter baru di suatu tempat di badan fungsi Anda.
Dari pada:
var str = "This" + String(myArray.count) + " is " + String(someVar)
Gunakan sintaks-template yang tampaknya jauh lebih efisien untuk diurai dengan cepat:
var str = "This \(myArray.count) is \(someVar)"
Dengan cara ini pada dasarnya saya tidak melihat batasan dalam strlen dengan inline vars "\ (*)".
Jika Anda memiliki perhitungan, yang menggunakan + / * - maka bagi menjadi bagian-bagian yang lebih kecil.
Dari pada:
var result = pi * 2 * radius
menggunakan:
var result = pi * 2
result *= radius
Ini mungkin terlihat kurang efisien, tetapi pengurai cepat jauh lebih cepat dengan cara ini. Beberapa rumus tidak dapat dikompilasi, jika memiliki banyak operasi, meskipun secara matematis benar.
Jika Anda memiliki beberapa kalkulasi yang kompleks, masukkan ke dalam func. Dengan cara ini pengurai dapat menguraikannya sekali dan tidak harus mengulanginya setiap kali Anda mengubah sesuatu di badan fungsi Anda.
Karena jika Anda memiliki kalkulasi di badan fungsi Anda, maka parser swift akan memeriksanya setiap saat jika jenis, sintaks, dll. Masih benar. Jika garis berubah di atas kalkulasi, maka beberapa vars di dalam kalkulasi / rumus Anda mungkin telah berubah. Jika Anda meletakkannya di fungsi eksternal maka itu akan divalidasi sekali dan swift senang bahwa itu akan benar dan tidak mengulanginya terus-menerus, yang menyebabkan penggunaan CPU yang tinggi.
Dengan cara ini saya mendapatkan dari 100% pada setiap penekanan tombol ke CPU rendah saat mengetik. Misalnya, 3 baris ini yang diletakkan sejajar di badan fungsi Anda dapat membuat swiftparser merayap.
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 )
tetapi jika saya memasukkannya ke dalam func dan memanggilnya nanti, swiftparser jauh lebih cepat
// 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 dan XCode 6.1 masih sangat bermasalah, tetapi jika Anda mengikuti trik sederhana ini, kode pengeditan menjadi dapat diterima lagi. Saya lebih suka cepat, karena menghapus file .h dan menggunakan sintaks yang jauh lebih bersih. Masih ada banyak tipe-casting yang dibutuhkan seperti "myVar as AnyObject", tapi itu kejahatan yang lebih kecil dibandingkan dengan struktur dan sintaks proyek objektif-c yang kompleks.
Juga pengalaman lain, saya mencoba SpriteKit, yang menyenangkan untuk digunakan, tetapi cukup tidak efisien jika Anda tidak memerlukan pengecatan ulang konstan pada 60fps. Menggunakan CALayer lama jauh lebih baik untuk CPU jika "sprite" Anda tidak sering berubah. Jika Anda tidak mengubah. Konten lapisan maka CPU pada dasarnya tidak aktif, tetapi jika Anda memiliki aplikasi SpriteKit yang berjalan di latar belakang, maka pemutaran video di aplikasi lain mungkin mulai tersendat karena loop pembaruan 60fps yang tidak terbatas.
Kadang-kadang xcode menunjukkan kesalahan ganjil saat kompilasi, kemudian masuk ke menu "Produk> Bersihkan" dan kompilasi lagi, tampaknya merupakan implementasi cache yang bermasalah.
Cara hebat lainnya untuk meningkatkan penguraian ketika xcode macet dengan kode Anda disebutkan di pos stackoverflow lain di sini . Pada dasarnya Anda menyalin semua konten dari file .swift Anda ke editor eksternal, dan kemudian berfungsi dengan fungsi menyalinnya kembali dan melihat di mana kemacetan Anda. Ini benar-benar membantu saya mendapatkan xcode ke kecepatan yang wajar lagi, setelah proyek saya menjadi gila dengan 100% CPU. saat menyalin kode Anda kembali, Anda dapat memfaktorkan ulang dan mencoba untuk menjaga agar fungsi-badan Anda tetap pendek dan fungsi / formulars / ekspresi sederhana (atau terbagi dalam beberapa baris).