2016-10-04 16 views
5

Khi thử nghiệm mã của tôi dưới Sierra, tôi thấy rằng các phương thức xử lý trước đó hàng đợi đồng thời không còn hoạt động nữa.Ứng dụng Swift sử dụng DispatchQueue.concurrentPerform (iterations :) không còn chạy đồng thời dưới Mac OS Sierra

Khi phân tích lỗi trong codebase C++, một trong những người dùng đã đề xuất cách giải quyết rõ ràng đặt mục tiêu cho khai báo hàng đợi (xem bài đăng này: C++11 app that uses dispatch_apply not working under Mac OS Sierra) dường như đã giải quyết được sự cố.

Trong Swift 3, đoạn code sau sẽ được sử dụng để thực hiện một đóng cửa đồng thời, nhưng nó được trưng bày một tương tự nhưng với C++ ví dụ trong bài viết ở trên:

import Foundation 
import GameKit 

DispatchQueue.concurrentPerform(iterations: 1000) { index in 
    let pauseTime = GKRandomSource.sharedRandom().nextInt(upperBound: 5) 
    sleep(UInt32(pauseTime)) 
    print(index) 
} 

... Tuy nhiên, khi tôi thực hiện nó, nó chạy mỗi khối serially và các chỉ số được đầu ra theo thứ tự số.

Bất kỳ ai biết cách tôi có thể tận dụng giải pháp được đề xuất trong bài đăng đó để giải quyết các vấn đề gửi "đồng thời" của tôi trong Swift?

+0

Bạn gọi 'concurrentPerform() 'vào các chủ đề chính? – duemunk

+0

Không chắc chắn. Những gì bạn thấy có nghĩa là toàn bộ mã nguồn. Như trong, tôi đã tạo một ứng dụng bảng điều khiển Swift và đó là phần thân của tệp Program.swift của tôi. Là nó mặc định cho lớp DispatchQueue để chạy trên thread chính? – Charles

+2

Nó phải được gọi trên một sợi không chính. Tôi đã không tìm thấy bất kỳ tài liệu nào cho nó, nhưng tôi có mã được thử nghiệm tốt hoạt động như tôi mong đợi. https://github.com/duemunk/Async/blob/master/Source/Async.swift#L538-L540 – duemunk

Trả lời

0

xây dựng trên bình luận duemunk của, đây là cách tôi áp dụng một hàm performFunction song song trên một hàng đợi nền:

let queue = DispatchQueue(label: "myQueue", qos: .userInteractive, attributes: .concurrent) 
    queue.async { 
     DispatchQueue.concurrentPerform(iterations: iterations) { 
      index in 
      performOperation(index) 
     } 
    } 
Các vấn đề liên quan