Спасибо, я понимаю. По сути, если приложение не работает в основной диспетчерской, я не могу использовать coreData?

от вопрос уже есть ответ здесь:

- [UIApplication делегат] должен вызываться только из основного потока 2 ответа

У меня есть следующий код в моем делегате приложения в качестве ярлыка для работы с CoreData в других моих viewControllers:

let ad = UIApplication.shared.delegate as! AppDelegate
let context = ad.persistentContainer.viewContext

Однако теперь я получаю сообщение об ошибке:

«API пользовательского интерфейса вызывается из фонового потока» и «UIApplication.delegate должен использоваться только из основного потока».

Я работаю с CoreData, пока мое приложение работает в фоновом режиме, но я впервые вижу это сообщение об ошибке. Кто-нибудь знает, что здесь происходит?

Обновление: я попытался переместить это внутри самого класса appDelegate, используя следующий код:

let dispatch = DispatchQueue.main.async {
    let ad = UIApplication.shared.delegate as! AppDelegate
    let context = ad.persistentContainer.viewContext
}

Теперь я больше не могу получить доступ к рекламным и контекстным переменным внеAppDelegate, Я что-то упускаю?

 LFHS09 нояб. 2017 г., 14:57
Я предполагаю, что мой вопрос, где находится правильное место для объявления и контекста? Должен ли я объявить это в моих viewControllers в основной рассылке?
 LFHS09 нояб. 2017 г., 14:43
Я использую Swift, а не Objective - C
 Anbu.Karthik09 нояб. 2017 г., 14:41
 Krunal09 нояб. 2017 г., 15:02
@LFHS Попробуйте с обновлениями в ответ.

Ответы на вопрос(1)

Решение Вопроса

С реф к этому (- [UIApplication делегат] должен вызываться только из основного потока) в Swift (для разрешения вашего запроса)

    DispatchQueue.main.async(execute: {

      // Handle further UI related operations here....
      //let ad = UIApplication.shared.delegate as! AppDelegate
      //let context = ad.persistentContainer.viewContext   

    })

С правкой: (Где правильное место для объявления и контекста? Должен ли я объявить это в моих viewControllers в основной рассылке)
Объявление места переменных (объявления и контекста) определяет сферу его действия. Вам нужно решить, какой будет область действия этих переменных. Вы можете объявить их уровень проекта или приложения (глобально), уровень класса или конкретный уровень этой функции. Если вы хотите использовать эти переменные в других ViewControllers, объявите их глобально или на уровне класса с открытым / открытым / внутренним контролем доступа.

   var ad: AppDelegate!    //or var ad: AppDelegate?
   var context: NSManagedObjectContext!    //or var context: NSManagedObjectContext?


   DispatchQueue.main.async(execute: {

      // Handle further UI related operations here....
      ad = UIApplication.shared.delegate as! AppDelegate
      context = ad.persistentContainer.viewContext   

      //or 

      //self.ad = UIApplication.shared.delegate as! AppDelegate
      //self.context = ad.persistentContainer.viewContext   

    })
 LFHS09 нояб. 2017 г., 15:19
Спасибо, я понимаю. По сути, если приложение не работает в основной диспетчерской, я не могу использовать coreData?
 Krunal09 нояб. 2017 г., 15:09
Да, это зависит от условия, которое вы устанавливаете вокруг этого блока кода. Вы устанавливаете какие-либо условия для этого блока кода. Я думаю, что должно быть условие, потому что вы можете использовать операцию с базой данных и как успешный результат работы базы данных, эти переменные инициализируются. Таким образом, эти переменные могут оставаться нулевыми, если работа базы данных завершится неудачно. Проверьте свой код и состояние.
 LFHS09 нояб. 2017 г., 15:03
Круто, это решило проблему, спасибо. Нужно ли делатьif let когда имеешь дело с рекламой и контекстом, так как они теперь опционные? Или я могу просто предположить, что они не будут равны нулю?
 LFHS09 нояб. 2017 г., 15:07
Да, но я сделал их неявно развернутыми. Есть ли вероятность, что при обращении к ним они будут равны нулю, что приведет к сбою приложения? Было бы лучше не скрывать их безоговорочно?
 Krunal09 нояб. 2017 г., 15:04
Если вы используете? необязательное объявление типаvar ad: AppDelegate? тогда вы должны использоватьif-let получить значение от переменнойad

Ваш ответ на вопрос