2013-07-02 30 views
14

Tôi đọc tài liệu Apple về cách Sử dụng hàng đợi nối tiếp để đảm bảo rằng các tác vụ thực thi theo thứ tự có thể dự đoán được nhưng bây giờ tôi bị nhầm lẫn quá nhiều.
Một số cách tôi có thể làm việc serially nhưng vẫn không rõ ràng vì vậy tôi cần ví dụ nối tiếp đơn giản cho các phương pháp của tôi để thực thi serially.Ví dụ hàng đợi nối tiếp GCD đơn giản như FIFO sử dụng khối

tôi chia chức năng của tôi trong 4 phần và bây giờ muốn họ thực hiện serially

[self ReadAllImagesFromPhotosLibrary]; 

[self WriteFewImagestoDirectory]; 

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView]; 
+0

Nếu bạn hài lòng với một trong các câu trả lời bên dưới, vui lòng đánh dấu câu trả lời là câu trả lời đúng. – Benjamin

Trả lời

1

Bạn có thể sử dụng NSOperationQueue với maxConcurrentOperationCount thiết lập để 1 (hoặc thậm chí thiết lập phụ thuộc cho mỗi NSOperation, vì vậy nó không khởi động trước khi sự phụ thuộc của nó kết thúc).

Dưới đây là NSOperationQueue Tham chiếu lớp.

Ngoài ra, hãy xem câu hỏi this.

3
dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_async(serialQueue, ^{ 
     [self ReadAllImagesFromPhotosLibrary]; 
      dispatch_async(serialQueue, ^{ 
        [self WriteFewImagestoDirectory]; 
        dispatch_async(serialQueue, ^{ 
         [self GettingBackAllImagesFromFolder]; 
         dispatch_async(serialQueue, ^{ 
           [self MoveToNextView]; 
         }); 
        }); 
       }); 
    }); 

Tôi nghĩ mã trên sẽ hoạt động nhưng đảm bảo các hoạt động giao diện người dùng được thực hiện trong chuỗi chính. Hy vọng nó giúp.

+0

cái gì? làm thế nào về một công văn không đồng bộ với 4 cuộc gọi phương pháp? (thực hiện điều tương tự) – dcow

+0

Nó không có ý nghĩa để đệ quy gửi các cuộc gọi. Đó là chi phí vô dụng. – Karsten

+0

"com.unique.name.queue" có thể là bất cứ điều gì đúng không? Nhưng tại sao bạn lại đặt tên như vậy? ** com ** có nghĩa là gì? – Honey

1

Tôi không biết nhiều về API hiện tại để thực hiện tương tự với các khối, nếu có.

Nhưng điều tương tự có thể được thực hiện bằng cách xác định các khối (đại diện cho các hoạt động bạn muốn) theo cách mà chúng trỏ tới khối tiếp theo để tiếp tục nếu có. Ngoài ra, bạn có thể đặt toàn bộ quá trình xử lý trong một hàng đợi riêng biệt.

đoạn vì có khối thi theo kiểu nối tiếp

BLOCK A(NEXT BLOCK reference){ 
->Do the the required Task 
->If(next Block reference) 
--->Then call that block 
->Else 
--->Exit or have a callback on mainthread 
} 
0

tại sao không thử GCD, nó đảm bảo trình tự của các hoạt động và cũng có đồng bộ và khả năng async

37

Để theo dõi và cải thiện iCoder Câu trả lời của, bạn có thể và nên làm như sau.

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

dispatch_async(serialQueue, ^{ 
     [self ReadAllImagesFromPhotosLibrary]; 
    }); 
dispatch_async(serialQueue, ^{ 
     [self WriteFewImagestoDirectory]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self GettingBackAllImagesFromFolder]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self MoveToNextView]; 
}); 

Mặc dù các cuộc gọi trên là async, họ sẽ có xếp hàng đợi và chạy serially như bang DISPATCH_QUEUE_SERIAL. Sự khác biệt giữa syncasync là với sync, mã của bạn sẽ dừng lại và chờ đợi cho câu trả lời khối trước khi chạy đoạn mã sau, do đó có khả năng đóng băng UI của bạn nếu thời gian thực hiện dài. Trong khi với async, mã chạy và khối được trả về không đồng bộ.

Tuy nhiên, các tác vụ bạn đã lưu trữ trong DISPATCH_QUEUE_SERIAL sẽ chờ và được thực thi lần lượt theo thứ tự khác, nhờ GCD (Grand Central Dispatch).

-1

Tôi đã thành công với một mẫu như thế này trong một cuộc săn lùng tương tự trong Swift 3.0 ...

let serialQueue = DispatchQueue.init(label: "com.foo.bar") 

serialQueue.sync {self.readAllImagesFromPhotosLibrary()} 

serialQueue.sync {self.rriteFewImagestoDirectory()} 

serialQueue.sync {self.gettingBackAllImagesFromFolder()} 

serialQueue.sync {self.moveToNextView()} 
Các vấn đề liên quan