перемещение асинхронной выборки данных ядра в расширения - PullRequest
0 голосов
/ 08 июня 2018

Я не могу найти способ сделать эту функцию многократно используемой в моем приложении (Swift 4.2), я хотел бы добавить в UIViewController через расширение, но я думаю, что это как-то не разрешено.Даже использование проблемы inout, по-видимому, не решено при перемещении и манипулировании им для «повторного использования» в остальной части приложения. Я получаю большинство из двух ошибок:

, если я пытаюсь установить аргумент метода «asyncFetch: NSAsynchronousFetchRequest»Я иду ошибка Не могу присвоить значение: «asyncFetch» ​​является константой «let», то же ошибка, если я пытаюсь добавить аргумент для массива

вторая ошибка возникает, когда я пытаюсь сделать func вернуть массив изNSmanagedObject, и я не могу использовать оператор guard, поскольку они «return» предназначены для возврата самого функционала (и более того, поскольку он асинхронный, не может возвращать заполненный массив, а только пустой)

    func asyncFetchAllEntities() {

        print("Fetching all entities...")

        asyncPersonEntityArray.removeAll(keepingCapacity: true)


        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}
        let managedContext = appDelegate.persistentContainer.viewContext

        let personFetch : NSFetchRequest<Person> = Person.fetchRequest()
        //here you can add some predicate

        //this block makes the fetch Asynch - start :
        //************************************************************************************
        asyncFetchRequest = NSAsynchronousFetchRequest<Person>(fetchRequest: personFetch) {
            [unowned self] (result: NSAsynchronousFetchResult) in
            guard let allPersonsResult = result.finalResult else {
                return
            }

            self.asyncPersonEntityArray = allPersonsResult

            //here you can do what you need - start :
            //************************************

            do {
                self.asyncPersonEntityArray = try managedContext.fetch(personFetch)
                if self.asyncPersonEntityArray.count > 0 {
                    print("OK - asyncFetchAllEntities: - entity model is not empty!") //
                } else {
//                    self.myPersErrorMessage(errorMessage: "WARNING! - no entitites error 1")
                    print("WARNING! - no entitites error 1")
                }
            } catch let error as NSError {
                print("WARNING! - asyncFetchAllEntities: Fetch error: \(error) description: \(error.userInfo)")
            }


            guard self.asyncPersonEntityArray != nil else {return}


            //here you can do all you want as updating tableview, make som check, etc:


            for personFound in self.asyncPersonEntityArray {

                let personToPrint = personFound as! Person

                guard personToPrint.name != nil else {
                    print("WARNING! : - name was nil!!")
                    return
                }

                print("Name is: \(personToPrint.name!) and age: \(personToPrint.age)")


            }


            print("...Fetched all entitites")


            //here you can do what you need - end :
            //************************************
        }
        //this block makes the fetch Asynch - end :
        //************************************************************************************

        // MARK: - async fetch request 3
        do {
            try managedContext.execute(asyncFetchRequest)
        } catch let error as NSError {
            print("WARNING! - asyncFetchAllEntities: Could not fetch \(error), \(error.userInfo)")
        }

        print("OK! - fetched completed")

        //end of function
    }
...