23

Tôi đang cố gắng tạo mảng đồng bộ (mạng) cho công ty tôi làm việc. Trong khi phần mạng hoạt động tốt, tôi đã gặp vấn đề.Hàng đợi nối tiếp FIFO sử dụng GCD

Mong muốn của tôi là tạo ra một hàng đợi mới sử dụng dispatch_create_queue, mà tôi sẽ thêm hai khối có không để chạy trên các chủ đề chính, nhưng trong một cách nối tiếp, có nghĩa là đầu tiên khối đầu tiên có để chạy, sau đó thứ hai, và không bao giờ song song.

Tôi đã đọc tài liệu về táo, nhưng ít gây nhầm lẫn khi nói ít nhất.

  • Khi tôi tạo hàng đợi của tôi sử dụng dispatch_queue_create và sau đó thêm các khối (sau khi họ đã được xác định) sử dụng dispatch_sync, tôi đã phát hiện ra rằng khối vẫn đang diễn ra trên các chủ đề chính.

  • Khi sử dụng dispatch_async, đó là khi các khối không thực thi trên luồng chính.

  • Khi tôi cố gắng thêm cả hai khối bằng cách sử dụng dispatch_sync Chúng bị chặn vĩnh viễn.

  • Thời gian duy nhất cả hai khối dường như chạy tốt và tắt chủ đề chính là khi gọi dispatch_async.

Tuy nhiên lý do tại sao tôi đã chọn GCD và phương pháp đồng bộ vì vậy mà tôi đã theo ấn tượng mà tôi đã tạo ra một hàng đợi mới (và do đó a thread mới) và rằng việc thêm khối vào hàng đợi mà sẽ chỉ đơn giản là chặn một cho đến khi người kia đã thực hiện xong. Đây không phải là trường hợp, hoặc không tạo ra một hàng đợi không đảm bảo rằng mã sẽ không chạy trên các chủ đề chính?

Trả lời

50

Đây là một hàng đợi FIFO trong GCD:

dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL); 

... 
dispatch_async(serialQueue, ^{ 
    //block1 
}); 

dispatch_async(serialQueue, ^{ 
    //block2 
}); 
+0

Vì vậy, nó không có gì để làm với dispatch_sync sau đó? Chỉ có cờ được sử dụng khi tạo nó? –

+5

dispatch_async làm cho nó để các cuộc gọi công văn tự nó không chặn cho đến khi khối được hoàn thành. Nếu bạn sử dụng dispatch_sync, bản thân nhiệm vụ được thực thi trong bất kỳ chuỗi nào có hàng đợi, nhưng bạn chặn luồng hiện tại cho đến khi tác vụ được thực hiện. Tôi không nghĩ đó là những gì bạn cần. –

+0

Cảm ơn bạn, những tên api này hơi khó hiểu. Lưu ngày của tôi! :) –

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