Ngay từ đầu, Swift đã cung cấp một số phương tiện để làm cho ObjC và C thêm Swifty, bổ sung thêm với mỗi phiên bản. Giờ đây, trong Swift 3, tính năng "nhập làm thành viên" mới cho phép các khung với các kiểu C API nhất định - nơi bạn có một kiểu dữ liệu hoạt động giống như một lớp và một loạt các hàm toàn cầu để hoạt động với nó - hành động giống như API gốc của Swift. Các kiểu dữ liệu nhập dưới dạng các lớp Swift, các hàm toàn cầu có liên quan của chúng nhập dưới dạng các phương thức và thuộc tính trên các lớp đó và một số thứ liên quan như các bộ hằng có thể trở thành các kiểu con khi thích hợp.
Trong Xcode 8 / Swift 3 beta, Apple đã áp dụng tính năng này (cùng với một vài tính năng khác) để làm cho khung công tác Swatch nhiều hơn Swifty. (Và Đồ họa lõi cũng vậy.) Nếu bạn đã theo dõi các nỗ lực nguồn mở Swift, đây không phải là tin tức , nhưng đây là lần đầu tiên nó là một phần của Xcode.
Bước đầu tiên của bạn khi chuyển bất kỳ dự án nào sang Swift 3 là mở nó trong Xcode 8 và chọn Chỉnh sửa> Chuyển đổi> Cú pháp Swift hiện tại ... trong menu. Điều này sẽ áp dụng (với đánh giá và phê duyệt của bạn) tất cả các thay đổi cùng một lúc cần thiết cho tất cả các API đã đổi tên và các thay đổi khác. (Thông thường, một dòng mã bị ảnh hưởng bởi nhiều hơn một trong những thay đổi này cùng một lúc, do đó, việc phản hồi sửa lỗi - cá nhân nó có thể không xử lý mọi thứ đúng.)
Kết quả là mô hình phổ biến cho công việc nảy lên nền và trở lại trông như thế này:
// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
DispatchQueue.main.async {
self.imageView.image = image
}
}
Lưu ý rằng chúng tôi đang sử dụng .userInitiated
thay vì một trong các DISPATCH_QUEUE_PRIORITY
hằng số cũ . Các công cụ xác định chất lượng dịch vụ (QoS) đã được giới thiệu trong OS X 10.10 / iOS 8.0, cung cấp một cách rõ ràng hơn cho hệ thống để ưu tiên công việc và không dùng các công cụ xác định ưu tiên cũ. Xem tài liệu của Apple về công việc nền và hiệu quả năng lượng để biết chi tiết.
Nhân tiện, nếu bạn đang giữ hàng đợi của riêng mình để sắp xếp công việc, thì cách để có được một hàng bây giờ trông như thế này (chú ý DispatchQueueAttributes
là OptionSet
, vì vậy bạn sử dụng các chữ theo kiểu bộ sưu tập để kết hợp các tùy chọn):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Dùng dispatch_after
để làm việc sau? Đó cũng là một phương pháp trên hàng đợi và cần một DispatchTime
toán tử có các toán tử cho các loại số khác nhau để bạn có thể chỉ cần thêm toàn bộ hoặc một phần giây:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Bạn có thể tìm đường xung quanh API công văn mới bằng cách mở giao diện của nó trong Xcode 8 - sử dụng Mở nhanh để tìm mô-đun công văn hoặc đặt một biểu tượng (như DispatchQueue
) trong dự án / sân chơi Swift của bạn và nhấp vào lệnh, sau đó phân nhóm các mô-đun từ đó. (Bạn có thể tìm thấy API Swift Dispatch trong trang web Tham khảo API mới của Apple và trình xem tài liệu trong Xcode, nhưng có vẻ như nội dung tài liệu từ phiên bản C chưa được chuyển vào.)
Xem Hướng dẫn di chuyển để biết thêm mẹo.