Загадочный EXC_BAD_ACCESS в dispatch_async *последовательной очереди*

У меня есть приложение на основе местоположения, которое получает местоположение каждую 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 (просто заставлю все выполняться по порядку в основном потоке), проблем не будет.

person Uzumaki Naruto    schedule 12.02.2016    source источник


Ответы (1)


Вы можете взглянуть на эту ссылку. Ваша проблема, вероятно, связана с тем, что в то время, когда вы пытаетесь вставить в него элемент, нет MOC.

Основные данные: вставка объектов, разбившихся в глобальные очередь [ARC - Симулятор iPhone 6.1]

person mSabu    schedule 02.03.2016