EXC_BAD_ACCESS (код = 1 в NSManagedObject (объект: - PullRequest
0 голосов
/ 13 июня 2018

У меня есть очень большой проект в Swift (приложение ios), где мне нужно сделать много изменений и получить доступ к coreData в разных местах в разных потоках.Сначала я столкнулся с большой проблемой доступа к данным, в то время как другой поток менял их, поэтому я реструктурировал свой проект следующим образом:

class dataManager {
    var bool : isAvailable

    func func1 ()
    {
        DispatchQueue.global(qos: .default).async {
            if(isAvailable)
            {
                self.isAvailable = false
                doStuff1
                self.isAvailable = true
            }
            else
            {
                sleep(1)
                func1()
            }
        }
    }

    func func2 ()
    {
        DispatchQueue.global(qos: .default).async {
            if(isAvailable)
            {
                self.isAvailable = false
                doStuff2
                self.isAvailable = true
            }
            else
            {
                sleep(1)
                func2()
            }
        }
    }

}

В реальном проекте гораздо больше, чем 2 функции.И тогда мои viewControllers в основном потоке вызывают функции, когда это необходимо.Таким образом, в основном функции ждут доступа к coreData, чтобы они могли читать или писать без проблем.Функции вызываются каждые 2 минуты или около того, поэтому не должно возникнуть проблем с ожиданием выполнения другой перед выполнением.Кажется, это работает довольно хорошо, он работает нормально, но через некоторое время он вылетит и выдаст мне EXC_BAD_ACCESS (code = 1. Сбой в этой строке:

let entity = NSEntityDescription.entity(forEntityName: self.namesEntry[i], in: managedContext)!
let event = NSManagedObject(entity: entity, insertInto: managedContext) //crashes here 

Переменная managedContext создается один раз всоздание класса:

    managedContext = appDelegate.persistentContainer.viewContext

и затем доступ к каждой функции.

Я прочитал много статей об этой ошибке, но все они говорят, что данные пытаются получить доступ к чему-токоторые были удалены, поэтому я не понимаю, как это возможно? учитывая, что работает только 1 функция (я проверил с отпечатками, чтобы убедиться, и действительно только одна функция доступна) Спасибо за вашу помощь

...