Tablica mutacji podczas czytania, nie wyliczająca
Jeśli mam dwa różne wątki za pośrednictwem GCD dostęp doNSMutableArray
a jeden polega po prostu na utworzeniu nowej tablicy opartej o zmienną tablicę, podczas gdy drugi wątek usuwa rekordy z tablicy, czy powinienem oczekiwać, że będzie to problem? To znaczy, czy kopia, która, jak przypuszczam, po prostu „czyta” tablicę, po prostu nie dostanie się w tym momencie do tablicy? Nie wyliczam tablicy w żadnym wątku, ale wciąż się zawiesza. Po usunięciu procedury odczytu działa dobrze.
Oto „czytaj”:
dispatch_async(saveQueue, ^{
NSDictionary*tempstocks=[NSDictionary dictionaryWithDictionary:self.data];
W tym wątku zawiesza się:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[9]'
Oto, co dzieje się w innym wątku:
[self.data removeObjectForKey:item];
Wiem, że nie można mutować podczas wyliczania, ale myślę, że byłoby dobrze czytać podczas mutacji, może nie wiesz, którą wersję zmutowanego obiektu otrzymasz, ale nie sądzę, że jest to problem, ale wyraźnie to jest . Możliwe żedictionaryWithDictionary
metoda wykonuje operację, która najpierw widzi obiekty X, ale do czasu zakończenia procedury zawiera obiekty X-Y, więc nie „przechwytuje” całegoself.data
słownik w jednym naciśnięciu, gdy działadictionaryWithDictionary
i zamiast tego wyliczaself.data
który zasadniczo byłby tym samym problemem co mutacja podczas wyliczania?