Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中使用阵列数据时处理阵列更新_Ios_Arrays_Locking_Nsmutablearray_Updates - Fatal编程技术网

在iOS中使用阵列数据时处理阵列更新

在iOS中使用阵列数据时处理阵列更新,ios,arrays,locking,nsmutablearray,updates,Ios,Arrays,Locking,Nsmutablearray,Updates,我有一个NSMutableArray,其中添加了一组自定义对象。我也在使用位置服务,每当locationManager:didUpdateLocations:时,我都会检查该数组,以使用适当的对象(数组的对象之一)执行一些操作。另一方面,我需要每隔几分钟更新一次这样的数组,所以我想如果在读取数组时更新数组,可能会导致冲突 在iOS中处理这种情况的最佳方法是什么 谢谢 您可以采取几种方法 第一种方法是让读取器线程将属性值复制到局部变量中,让update方法操作数组的副本(或创建新数组),然后将属性

我有一个
NSMutableArray
,其中添加了一组自定义对象。我也在使用位置服务,每当
locationManager:didUpdateLocations:
时,我都会检查该数组,以使用适当的对象(数组的对象之一)执行一些操作。另一方面,我需要每隔几分钟更新一次这样的数组,所以我想如果在读取数组时更新数组,可能会导致冲突

在iOS中处理这种情况的最佳方法是什么


谢谢

您可以采取几种方法

第一种方法是让读取器线程将属性值复制到局部变量中,让update方法操作数组的副本(或创建新数组),然后将属性设置为updated/new数组。这将确保读取器方法在下次执行之前继续使用旧数据操作。类似这样的事情-

-(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
     }
}
第一种方法可能会导致更大的内存开销和复制阵列的时间(如果阵列较大,这一点很重要)。第二种方法可能会阻塞主线程,因此可能会出现UI性能问题,但这可能不会成为问题,这是我推荐的方法