2017-07-06 17 views
7

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

enter image description here

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

+1

Bạn đã thử [tìm kiếm Google] đơn giản (https://www.google.com/search?q=Main+Thread+Checker) chưa? – deadbeef

+1

Không tìm thấy giải pháp nào được giải thích rõ ràng – suthar

+1

https://developer.apple.com/documentation/code_diagnostics/main_thread_checker – deadbeef

Trả lời

14

Từ Apple documentation:

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.

17

Nó có thể được bật/tắt trong tùy chọn chẩn đoán của lược đồ. Bên cạnh đó, "Tạm dừng các vấn đề" là một tùy chọn thoải mái để gỡ lỗi các vấn đề này.

Example

+0

Giải thích tốt, cảm ơn bạn –

0

Theo API Runtime phần Kiểm tra, đảm bảo rằng các Chủ đề chính Checker được kích hoạt để xem nếu bạn đang thực hiện phương pháp ui trong một thread phi UI

enter image description here

enter image description here

Các vấn đề liên quan