Gypsa
Gypsa

Reputation: 11314

performBackgroundTask Fault Error when fetching data in Core Data

I am encoutering a strange issue: I am using a backgroundFetch to fetch the data from Core Data.

func fetchDataFromCoreData(completion:@escaping()->Void)
    {
        let appdel = UIApplication.shared.delegate as! AppDelegate
        let context = appdel.persistentContainer.viewContext

        appdel.persistentContainer.performBackgroundTask { (context) in

        let fetchReq = NSFetchRequest<NSFetchRequestResult>(entityName: "FreeApps")
        do
        {
                let data = try context.fetch(fetchReq) as? [NSManagedObject]
            self.resultData = data
            print(self.resultData ?? "data is empty")
            DispatchQueue.main.async{
            completion()
            }
        }

        catch
        {
            print("fetch error")
        }
       }

    }

Now in my view Controller, in my table cell:

  let myDict = itunesViewModelObj.resultData?[indexPath.row] as? NSManagedObject
        print(myDict?.value(forKey: "name") as? String ?? "no name")myDict shows as fault but valefor key comes nil

Now if I comment the performBackgroundTask line data comes properly.

Please help as what can be the issue with backgroundTask. Any suggestions will be highly appreciated! Thanks in advance!

Upvotes: 1

Views: 252

Answers (1)

Sebastian
Sebastian

Reputation: 39

The PersistentContainer operates on the main queue. As the name of the property implies, this managed object context is designed to be used in combination with the application's user interface. Maybe you need to dispatch back to the main queue to interact with UIApplicationDelegate and PersistentContainer. PerformBackgroundTask is generally used for updates to core data. If you are doing fetches you should use the main viewContext. Maybe using...

DispatchQueue.main.async {

// your code

}

Upvotes: 1

Related Questions