Tôi đã kiểm tra những gì mới trong 9 tài liệu Xcode, Tôi tìm thấy điều nàyChủ đề chính Checker là gì trong Xcode 9
Nhưng tôi did't hiểu những gì là làm thế nào tôi có thể sử dụng điều này với mới Xcode 9
Tôi đã kiểm tra những gì mới trong 9 tài liệu Xcode, Tôi tìm thấy điều nàyChủ đề chính Checker là gì trong Xcode 9
Nhưng tôi did't hiểu những gì là làm thế nào tôi có thể sử dụng điều này với mới Xcode 9
Các chủ đề chính Checker là một công cụ độc lập cho các ngôn ngữ Swift và C rằng phát hiện việc sử dụng không hợp lệ AppKit, UIKit và các API khác trên chuỗi nền . Cập nhật giao diện người dùng trên một chủ đề khác với chủ đề chính là lỗi thường gặp có thể dẫn đến các cập nhật giao diện người dùng bị thiếu, hình ảnh lỗi, lỗi dữ liệu và sự cố.
Vì vậy, ví dụ như cố gắng thay đổi text
tài sản của một UILabel
trên nền chủ đề sẽ không hoạt động. Apple nói rằng điều này có thể dẫn đến các bản cập nhật giao diện người dùng bị thiếu , khiếm khuyết trực quan, lỗi dữ liệu và sự cố. Trong thực tế, 99% thời gian này sẽ dẫn đến ngẫu nhiên cập nhật giao diện người dùng bị thiếu và khiếm khuyết trực quan (và không bị treo).
Sự cố sẽ thực sự tốt vì chúng tôi có thể phát hiện dễ dàng việc sử dụng không đúng cách như vậy UIKit
, nhưng khiếm khuyết thị giác ngẫu nhiên khó phát hiện hơn trong quá trình phát triển. Và đó là nơi các Chủ đề chính Checker do thỏa thuận.
Các chính Chủ đề Checker sẽ giúp dectect sử dụng của UIKit
trên một sợi nền, nó sẽ không giải quyết chúng. Khi bạn đã phát hiện thấy việc sử dụng UIKit
trên một chuỗi nền, bạn có thể giải quyết nó bằng cách sử dụng DispatchQueue
.
Một lần nữa, từ Apple documentation:
Các tài liệu của URLSession
nói rằng việc đóng cửa hoàn thành sẽ được gọi là trên một sợi nền, vì vậy đây là xấu, các Checker Main Chủ đề sẽ giúp bạn phát hiện việc sử dụng UIKit trên nền chủ đề.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
self.label.text = "\(data.count) bytes downloaded"
// Error: label updated on background thread
}
}
task.resume()
Giải pháp: Sử dụng DispatchQueue.main
để thực hiện cập nhật giao diện người dùng trên chủ đề chính.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
DispatchQueue.main.async { // Correct
self.label.text = "\(data.count) bytes downloaded"
}
}
}
task.resume()
Chính giải pháp không liên quan gì đến Xcode, đây là tính năng của ngôn ngữ. Vì vậy, rõ ràng là nó có thể có trong các phiên bản trước của Xcode, nhưng trước khi Xcode 9 bạn không có Trình kiểm tra chuỗi chính để giúp bạn phát hiện sự cố.
Khi @hamish chỉ ra, bạn cũng có thể xem the WWDC video để được giải thích chi tiết hơn.
Bạn đã thử [tìm kiếm Google] đơn giản (https://www.google.com/search?q=Main+Thread+Checker) chưa? – deadbeef
Không tìm thấy giải pháp nào được giải thích rõ ràng – suthar
https://developer.apple.com/documentation/code_diagnostics/main_thread_checker – deadbeef