#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
}
}
Первый метод может потребовать больших затрат памяти и времени на копирование массива (это важно, если массив большой). Второй может блокировать ваш основной поток, поэтому у вас могут возникнуть проблемы с производительностью пользовательского интерфейса, но это, вероятно, не будет проблемой, и я бы рекомендовал именно такой подход.