ตั้งแต่เริ่มต้น Swift ได้จัดหาสิ่งอำนวยความสะดวกบางอย่างสำหรับการทำ ObjC และ C ให้ Swifty มากขึ้นเพิ่มมากขึ้นในแต่ละรุ่น ตอนนี้ใน Swift 3 คุณลักษณะ"นำเข้าในฐานะสมาชิก"ใหม่ช่วยให้เฟรมเวิร์กมีลักษณะบางอย่างของ C API - ซึ่งคุณมีชนิดข้อมูลที่ทำงานคล้ายคลาสและมีฟังก์ชันระดับโลกมากมายให้ใช้งานได้ - ทำหน้าที่เหมือน Swift-native APIs ชนิดข้อมูลที่นำเข้าเป็นคลาส Swift ฟังก์ชันส่วนกลางที่เกี่ยวข้องนำเข้าเป็นวิธีการและคุณสมบัติในคลาสเหล่านั้นและบางสิ่งที่เกี่ยวข้องเช่นชุดของค่าคงที่สามารถกลายเป็นชนิดย่อยตามความเหมาะสม
ใน Xcode 8 / Swift 3 beta, Apple ได้ใช้คุณสมบัตินี้ (รวมถึงรุ่นอื่น ๆ ) เพื่อทำให้เฟรมเวิร์ก Dispatch Swifty มีมากขึ้น (และกราฟิกคอร์เช่นกัน) หากคุณได้ติดตามความพยายามของโอเพ่นซอร์ส Swift นี่ไม่ใช่ข่าวแต่ตอนนี้เป็นครั้งแรกที่เป็นส่วนหนึ่งของ Xcode
ขั้นตอนแรกของคุณในการย้ายโครงการใด ๆ ไปยัง Swift 3ควรจะเปิดใน Xcode 8 และเลือกแก้ไข> แปลง> เป็นไวยากรณ์ Swift ปัจจุบัน ...ในเมนู สิ่งนี้จะนำไปใช้ (ด้วยการตรวจสอบและการอนุมัติของคุณ) การเปลี่ยนแปลงทั้งหมดในครั้งเดียวที่จำเป็นสำหรับ API ที่เปลี่ยนชื่อและการเปลี่ยนแปลงอื่น ๆ (บ่อยครั้งที่บรรทัดของรหัสได้รับผลกระทบจากการเปลี่ยนแปลงมากกว่าหนึ่งรายการในครั้งเดียวดังนั้นการตอบสนองต่อการแก้ไขข้อผิดพลาดอาจไม่สามารถจัดการทุกอย่างได้)
ผลลัพธ์ก็คือรูปแบบทั่วไปของการตีกลับงานเป็นพื้นหลังและกลับมาในลักษณะนี้:
// 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
}
}
โปรดทราบว่าเราใช้.userInitiated
แทนDISPATCH_QUEUE_PRIORITY
ค่าคงที่แบบเก่าอย่างใดอย่างหนึ่ง ตัวระบุคุณภาพของการบริการ (QoS) ถูกนำมาใช้ใน OS X 10.10 / iOS 8.0 ซึ่งเป็นวิธีที่ชัดเจนสำหรับระบบในการจัดลำดับความสำคัญของงานและลดค่าตัวระบุลำดับความสำคัญเก่า ดูเอกสารประกอบของ Apple เกี่ยวกับการทำงานพื้นหลังและการประหยัดพลังงานเพื่อดูรายละเอียด
อย่างไรก็ตามถ้าคุณรักษาคิวของตัวเองเพื่อจัดระเบียบงานวิธีรับตอนนี้มีลักษณะดังนี้ (โปรดสังเกตว่านั่นDispatchQueueAttributes
คือOptionSet
เพื่อให้คุณใช้ตัวอักษรสไตล์คอลเลกชันเพื่อรวมตัวเลือก):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
ใช้dispatch_after
เพื่อทำงานในภายหลังหรือไม่ นั่นเป็นวิธีการในคิวเช่นกันและใช้เวลาDispatchTime
ซึ่งมีตัวดำเนินการสำหรับประเภทตัวเลขต่าง ๆ เพื่อให้คุณสามารถเพิ่มวินาทีหรือเศษส่วนได้ทั้งหมด:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
คุณสามารถค้นหาเส้นทางของคุณใน Dispatch API ใหม่ได้โดยการเปิดอินเทอร์เฟซใน Xcode 8 - ใช้ Open อย่างรวดเร็วเพื่อค้นหาโมดูล Dispatch หรือใส่สัญลักษณ์ (เช่นDispatchQueue
) ในโครงการ / สนามเด็กเล่น Swift ของคุณแล้วคลิกที่คำสั่ง โมดูลจากที่นั่น (คุณสามารถค้นหา Swift Dispatch API ได้ในเว็บไซต์อ้างอิง API ใหม่ของ Apple และโปรแกรมดูเอกสาร in-Xcode แต่ดูเหมือนว่าเนื้อหา doc จากเวอร์ชั่น C ยังไม่ได้ย้ายเข้ามาเลย)
ดูคู่มือการย้ายถิ่นสำหรับเคล็ดลับเพิ่มเติม