防止'枚举,同时变异' for循环中的错误

时间:2015-02-08 12:02:26

标签: ios objective-c swift

dispatch_async(self._queue, {
    // Remove old stops
    for (var i = 0; i < self.activeStops.count; i++) {
        if (!MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.activeStops[i].coordinate))) {
            self.mapView.removeAnnotation(self.activeStops[i])
            self.activeStops.removeAtIndex(i)
        }
    }

    // Add new stops
    for (var i = 0; i < self.busStops.count; i++) {
        if (MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.busStops[i].position))) {
            let stop: StopAnnotation! = StopAnnotation()
            stop.setCoordinate(self.busStops[i].position)
            stop.bearing = self.busStops[i].bearing
            stop.name = self.busStops[i].name
            stop.lines = self.busStops[i].lines
            stop.atcocode = self.busStops[i].atcocode
            self.activeStops.append(stop)
        }
    }

    // Add new stops to map
    dispatch_async(self._queue, {
        self.mapView.addAnnotations(self.activeStops)
        self.isUpdatingMap = false
    })
})

self.nearestStopsTable.reloadData()

我想做的以及我在上面的代码中尝试做的是删除在屏幕上不再可见的公交车站,然后继续添加新的公交车站。

问题出在我当前的方法上,我在枚举数据时它正在变异,因此它会引发错误。

我假设这是因为我正在循环访问activeStops数组时从{{1}}数组中删除。

如何更改我的代码,以便它不会产生此错误?

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

   for (var i = 0; i < self.activeStops.count; i++) {
        if (!MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.activeStops[i].coordinate))) {
            self.mapView.removeAnnotation(self.activeStops[i])
            self.activeStops.removeAtIndex(i)
        }
    }

您在迭代过程中突变了activateStops

您可以执行以下操作,而不是在迭代时删除对象:

var indicesToRemove : NSMutableIndexSet = NSMutableIndexSet()

for (var i = 0; i < self.activeStops.count; i++) {
    if (!MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.activeStops[i].coordinate))) {
        self.mapView.removeAnnotation(self.activeStops[i])
        indicesToRemove.addIndex(i);
    }
}

self.activeStops.removeObjectsAtIndexes(indicesToRemove)