TL; DR:
Tất cả các thao tác giao diện người dùng nên được thực hiện trong Chủ đề chính để tránh sự cố. Nếu không làm được như vậy, Bộ kiểm tra luồng chính (Tính năng gỡ lỗi mới được giới thiệu trong XCode 9) sẽ tạo ra các sự cố khi Runtime. Vì vậy, bọc mã của bạn trong khối Chủ đề chính như bên dưới để tránh trục trặc và cảnh báo thời gian chạy.
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
Trong bản phát hành Xcode trước ver. 9, các cảnh báo liên quan đến luồng chính sẽ được in dưới dạng văn bản trong khu vực bàn điều khiển. Dù sao, bạn có thể tùy ý vô hiệu hóa ( không phải là cách tiếp cận được khuyến nghị ) Bộ kiểm tra luồng chính trong cài đặt Chẩn đoán trong Sơ đồ chỉnh sửa .
Giải trình:
Apple đã giới thiệu một tùy chọn gỡ lỗi mới trong XCode 9 để kiểm tra các vấn đề trong Runtime cho UIKit và các API khác thao tác các phần tử giao diện người dùng. Nếu có bất kỳ thay đổi nào đối với các phần tử giao diện người dùng từ API UIKit lúc Runtime mà không có khối Chủ đề chính, thì rất có thể gây ra trục trặc và lỗi giao diện người dùng. Trình kiểm tra luồng chính được bật theo mặc định để bắt các vấn đề đó trong thời gian chạy. Bạn có thể tắt Trình kiểm tra luồng chính trong cửa sổ Chỉnh sửa lược đồ giống như bên dưới, mặc dù không thực sự khuyến khích làm như vậy:
Nếu bạn có bất kỳ SDK hoặc Khung công tác cũ hơn nào, khi cập nhật lên Xcode 9, bạn có thể gặp phải cảnh báo này vì một số lệnh gọi phương thức UIKit sẽ không được bao bọc trong Chuỗi chính. Cập nhật chúng lên phiên bản mới nhất sẽ khắc phục được sự cố (nếu nhà phát triển biết về nó và đã khắc phục).
Trích dẫn từ ghi chú phát hành XCode 9 beta:
- Tính năng mới trong Xcode 9 - Trình kiểm tra luồng chính.
- Cho phép phát hiện lạm dụng API giao diện người dùng từ chuỗi nền
- Phát hiện các lệnh gọi phương thức AppKit, UIKit và WebKit không được thực hiện trên chuỗi chính.
- Tự động bật trong quá trình gỡ lỗi và có thể bị vô hiệu hóa trong tab Chẩn đoán của trình chỉnh sửa lược đồ.
- Main Thread Checker hoạt động với ngôn ngữ Swift và C.
UIApplication.shared.registerForRemoteNotifications()
trong chuỗi chính. :) Để google cách gọi nó trong main thread ...