2016-06-29 14 views
6

Tôi đang tìm hiểu về GCD của Apple và xem video Concurrent Programming With GCD in Swift 3.Sự khác biệt giữa việc gửi đến hàng đợi có `đồng bộ` và sử dụng một mục công việc có cờ` .wait`?

Lúc 16:00 trong video này, một cờ cho DispatchWorkItem được mô tả là .wait và chức năng và sơ đồ cả hai hiển thị chính xác những gì tôi nghĩ là myQueue.sync(execute:) là dành cho.

.wait diagram

Vì vậy, câu hỏi của tôi là;

myQueue.sync { sleep(1); print("sync") } 

Và:: Sự khác nhau giữa là gì

myQueue.async(flags: .wait) { sleep(1); print("wait") } 
// NOTE: This syntax doesn't compile, I'm not sure where the `.wait` flag moved to. 
// `.wait` Seems not to be in the DispatchWorkItemFlags enum. 

Có vẻ như cả hai phương pháp ngăn chặn các chủ đề hiện tại trong khi họ chờ đợi được ghi tên vào:

  1. Kết thúc bất kỳ hiện tại hoặc trước công việc (nếu nối tiếp)
  2. Hoàn thành khối/mục công việc đã cho

Sự hiểu biết của tôi về điều này phải ở một nơi nào đó, tôi đang thiếu gì?

Trả lời

8

.waitkhông một lá cờ trong DispatchWorkItemFlags, và đó là lý do tại sao mã của bạn

myQueue.async(flags: .wait) { sleep(1); print("wait") } 

không biên dịch.

wait() is a method of DispatchWorkItem và chỉ là trình bao bọc cho dispatch_block_wait().

/*! 
* @function dispatch_block_wait 
* 
* @abstract 
* Wait synchronously until execution of the specified dispatch block object has 
* completed or until the specified timeout has elapsed. 

ví dụ đơn giản:

let myQueue = DispatchQueue(label: "my.queue", attributes: .concurrent) 
let workItem = DispatchWorkItem { 
    sleep(1) 
    print("done") 
} 
myQueue.async(execute: workItem) 
print("before waiting") 
workItem.wait() 
print("after waiting") 

dispatchMain() 
+0

Cảm ơn. Có vẻ như nó cung cấp cho bạn một chút chi tiết hơn về kiểm soát hơn là 'đồng bộ 'sau đó. 'DispatchMain()' đang làm gì? – SimplGy

+0

@SimplGy: https://developer.apple.com/reference/dispatch/1452860-dispatch_main. Bạn cần trong các chương trình không có runloop (như các chương trình dòng lệnh) để giữ cho GCD chạy. Trong một Playground bạn đạt được hiệu ứng tương tự (tôi nghĩ) với 'PlaygroundPage.current.needsIndefiniteExecution = true' (http://stackoverflow.com/questions/24058336/how-do-i-run-asynchronous-callbacks-in-playground) –

+0

@MartinR Cảm ơn bạn! Một câu hỏi nhỏ: nếu mã bên trong khối 'workItem' là không đồng bộ thì sao? Ví dụ: 'preload (completionHandler:)' của 'SKTextureAtlas'. Làm thế nào chúng ta có thể đảm bảo rằng 'workItem' sẽ đợi mã đó kết thúc và chỉ sau đó đánh dấu chính nó là đã hoàn thành? – damirstuhec

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