Обработка обновлений массива при использовании его данных в iOS

#ios #arrays #locking #nsmutablearray #updates

#iOS #массивы #блокировка #nsmutablearray #Обновления

Вопрос:

У меня есть NSMutableArray место, где я добавляю набор пользовательских объектов. Я также использую службу определения местоположения, и всякий locationManager:didUpdateLocations: раз, когда я проверяю этот массив, я выполняю некоторые операции с соответствующим объектом, который является одним из объектов массива. С другой стороны, мне нужно обновлять такой массив каждые несколько минут, поэтому я предполагаю, что это может вызвать конфликт, если массив обновляется во время его чтения.

Каким должен быть наилучший способ справиться с этим сценарием в iOS?

Спасибо!

Ответ №1:

Есть несколько подходов, которые вы можете предпринять.

Во-первых, ваш поток чтения должен скопировать значение свойства в локальную переменную, а ваш метод обновления — обработать копию массива (или создать новый массив), а затем установить свойство в обновленный / новый массив. Это гарантирует, что метод reader продолжит работать со старыми данными до его следующего выполнения. Что-то вроде этого —

 -(void)readerMethod {
   NSMutableArray *myData=self.myArrayProperty;
   // You can now operate safely on myData
}

-(void)updateLocations {
     NSMutableArray *myData=[self.myArrayProperty copy];
     //  manipulate myData
     self.myArrayProperty=myData;
}
 

Второй подход заключается в использовании @synchronized

 -(void)readerMethod {
   @synchronized(self.myArrayProperty) {
     // Array operations
   }
}

-(void)updateLocations {
     @synchronized(self.myArrayProperty) {
     //  manipulate myData
     }
}
 

Первый метод может потребовать больших затрат памяти и времени на копирование массива (это важно, если массив большой). Второй может блокировать ваш основной поток, поэтому у вас могут возникнуть проблемы с производительностью пользовательского интерфейса, но это, вероятно, не будет проблемой, и я бы рекомендовал именно такой подход.