Tôi cũng gặp phải 100% + CPU trong khi gõ một số mã "đơn giản". Một số thủ thuật nhỏ để giúp phân tích cú pháp nhanh hơn bằng cách bạn cấu trúc mã của mình.
Không sử dụng ký tự "+" trong chuỗi. Đối với tôi, điều này gây ra sự chậm chạp rất nhanh chóng. Mỗi dấu "+" mới đưa trình phân tích cú pháp thu thập thông tin và nó phải phân tích lại mã mỗi khi bạn thêm một ký tự mới ở đâu đó trong thân hàm của mình.
Thay vì:
var str = "This" + String(myArray.count) + " is " + String(someVar)
Sử dụng cú pháp mẫu có vẻ hiệu quả hơn nhiều để phân tích cú pháp nhanh chóng:
var str = "This \(myArray.count) is \(someVar)"
Bằng cách này về cơ bản tôi không nhận thấy giới hạn trong strlen với các vars nội tuyến "\ (*)".
Nếu bạn có các phép tính sử dụng + / * - thì hãy chia chúng thành các phần nhỏ hơn.
Thay vì:
var result = pi * 2 * radius
sử dụng:
var result = pi * 2
result *= radius
Nó có thể trông kém hiệu quả hơn, nhưng trình phân tích cú pháp nhanh hơn theo cách này nhanh hơn nhiều. Một số công thức sẽ không biên dịch, nếu chúng phải thực hiện nhiều phép toán, ngay cả khi chúng đúng về mặt toán học.
Nếu bạn có một số phép tính phức tạp thì hãy đặt nó trong một func. Bằng cách này, trình phân tích cú pháp có thể phân tích cú pháp một lần và không phải phân tích lại nó mỗi khi bạn thay đổi điều gì đó trong cơ thể hàm của mình.
Bởi vì nếu bạn có một phép tính trong phần thân hàm của mình thì bằng cách nào đó, trình phân tích cú pháp nhanh sẽ kiểm tra nó mọi lúc nếu các kiểu, cú pháp, v.v. vẫn đúng. Nếu một dòng thay đổi phía trên phép tính, thì một số dòng bên trong phép tính / công thức của bạn có thể đã thay đổi. Nếu bạn đặt nó vào một chức năng bên ngoài thì nó sẽ được xác thực một lần và nhanh chóng rất vui vì nó sẽ đúng và không phải trả lại liên tục, điều này gây ra việc sử dụng CPU cao.
Bằng cách này, tôi đã nhận được từ 100% trên mỗi lần nhấn phím đến CPU thấp trong khi nhập. Ví dụ: 3 dòng này được đặt nội tuyến trong phần thân hàm của bạn có thể đưa người chạy nhanh hơn đến thu thập thông tin.
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 )
nhưng nếu tôi đặt nó trong một func và gọi nó sau, swiftparser sẽ nhanh hơn nhiều
// 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 và XCode 6.1 vẫn còn rất nhiều lỗi, nhưng nếu bạn làm theo các thủ thuật đơn giản này, việc chỉnh sửa mã trở nên có thể chấp nhận được. Tôi thích nhanh hơn rất nhiều, vì nó loại bỏ các tệp .h và sử dụng cú pháp gọn gàng hơn nhiều. Vẫn còn nhiều kiểu ép kiểu cần thiết như "myVar as AnyObject", nhưng đó là cái ác nhỏ hơn so với cấu trúc và cú pháp dự án target-c phức tạp.
Ngoài ra, một trải nghiệm khác, tôi đã thử SpriteKit, nó rất thú vị khi sử dụng, nhưng nó khá kém hiệu quả nếu bạn không cần sơn lại liên tục ở tốc độ 60 khung hình / giây. Sử dụng CALayers cũ sẽ tốt hơn nhiều cho CPU nếu "sprites" của bạn không thay đổi thường xuyên. Nếu bạn không thay đổi .contents của các lớp thì CPU về cơ bản không hoạt động, nhưng nếu bạn có ứng dụng SpriteKit đang chạy trong nền, thì video phát lại trong các ứng dụng khác có thể bắt đầu bị giật do vòng lặp cập nhật 60 khung hình / giây không giới hạn.
Đôi khi xcode hiển thị các lỗi kỳ lạ trong khi biên dịch, sau đó vào menu "Sản phẩm> Dọn dẹp" và biên dịch lại, có vẻ như là một lỗi triển khai bộ nhớ cache.
Một cách tuyệt vời khác để cải thiện phân tích cú pháp khi xcode bị kẹt với mã của bạn được đề cập trong một bài đăng stackoverflow khác tại đây . Về cơ bản, bạn sao chép tất cả nội dung từ tệp .swift của mình vào một trình chỉnh sửa bên ngoài, sau đó hoạt động theo chức năng, sao chép lại và xem điểm nghẽn của bạn ở đâu. Điều này thực sự đã giúp tôi lấy lại xcode với tốc độ hợp lý, sau khi dự án của tôi trở nên điên rồ với 100% CPU. trong khi sao chép lại mã của bạn, bạn có thể cấu trúc lại nó và cố gắng giữ cho phần thân hàm của bạn ngắn gọn và các hàm / công thức / biểu thức đơn giản (hoặc chia thành nhiều dòng).