У меня есть приложение на основе местоположения, которое получает местоположение каждую 1 секунду и сохраняет группу местоположений за раз в БД CoreData, чтобы не делать массив местоположений слишком большим. Однако по какой-то причине он вылетает с EXC_BAD_ACCESS, хотя я использую dispatch_async в ПОСЛЕДОВАТЕЛЬНОЙ ОЧЕРЕДИ:
Создал глобальную последовательную настраиваемую очередь следующим образом:
var MyCustomQueue : dispatch_queue_t =
dispatch_queue_create("uniqueID.for.custom.queue", DISPATCH_QUEUE_SERIAL);
в функции протокола didUpdateToLocation у меня есть этот фрагмент кода, который сохраняет последнюю партию элементов CLLocation на диск, если размер партии больше заданного числа:
if(myLocations.count == MAX_LOCATIONS_BUFFER)
{
dispatch_async(MyCustomQueue)
{
for myLocation in self.myLocations
{
// the next line is where it crashes with EXC_BAD_ACCESS
newLocation = NSEntityDescription.insertNewObjectForEntityForName(locationEntityName, inManagedObjectContext: context as NSManagedObjectContext) ;
newLocation.setValue(..)
// all the code to set the attributes
}
appDelegate.saveContext();
dispatch_async(dispatch_get_main_queue()) {
// once the latest batch is saved, empty the in-memory array
self.myLocations = [];
}
}
}
Загадка в том, что SERIAL QUEUE не должна выполнять все элементы в ней по порядку, даже если вы используете dispatch_async (который просто делает выполнение параллельным с MAIN потоком, который не касается данных SQLite)?
Примечания:
- Авария происходит в случайное время ... иногда она падает через 0,5 мили, иногда через 2 мили и т. д.
- Если я просто удалю любой код dispatch_async (просто заставлю все выполняться по порядку в основном потоке), проблем не будет.