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.
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:
- 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)
- 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ì?
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
@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) –
@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