Về cơ bản, tôi có một bộ dữ liệu trong một NSDictionary
, nhưng để thuận tiện, tôi đang thiết lập một số NSArray
s với dữ liệu được sắp xếp và lọc theo một vài cách khác nhau. Dữ liệu sẽ đến qua các luồng khác nhau (khối) và tôi muốn đảm bảo chỉ có một khối tại một thời điểm sửa đổi kho dữ liệu của tôi.@ không đồng bộ khối so với GCD dispatch_async()
Tôi đã gặp rắc rối khi thiết lập hàng đợi công văn vào chiều nay, và sau đó tình cờ gặp một bài đăng về số @synchronized
làm cho nó có vẻ giống như những gì tôi muốn làm.
Vì vậy, những gì tôi đã ngay bây giờ là ...
// a property on my object
@property (assign) dispatch_queue_t matchSortingQueue;
// in my object init
_sortingQueue = dispatch_queue_create("com.asdf.matchSortingQueue", NULL);
// then later...
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
dispatch_async(_sortingQueue, ^{
// do stuff...
});
}
Và câu hỏi của tôi là, tôi có thể chỉ thay thế tất cả những điều này với những điều sau?
- (void)sortArrayIntoLocalStore:(NSArray*)matches
{
@synchronized (self) {
// do stuff...
};
}
... Và sự khác biệt giữa hai trường hợp là gì? Tôi nên cân nhắc điều gì?
'@ synchronization' thực sự chậm. Tôi không thể tìm thấy số liệu tôi đang tìm kiếm ngay bây giờ, nhưng cũng có thể xem https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html. – Richard
Nếu dữ liệu của bạn đến qua cùng một hàng đợi công văn (cùng một chuỗi) thì chúng sẽ không va chạm. Nếu bạn sẽ sử dụng các hàng đợi khác nhau (các luồng khác nhau) thì một đồng bộ hóa sẽ cần thiết. – Jeremy
Tìm thấy nó (thông qua http://stackoverflow.com/q/10094361/480850): http://perpendiculo.us/?p=133 – Richard