在另一个函数中使用函数的输出?

时间:2016-12-06 16:28:38

标签: swift function

我有一个获取请求,我想使用结果来通知其他功能。获取是

   func getExercises() {

    guard let managedObjectContext = managedObjectContext else { return }
    let userExercise = UserExercise(context: managedObjectContext)

    let request: NSFetchRequest<UserExercise> = UserExercise.fetchRequest()
    request.predicate = NSPredicate(format: "usersroutine == %@", self.routineName)
    do {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let queryResults = try context.fetch(request)
        print ("num of results = \(queryResults.count)")
            for exercise in queryResults as [NSManagedObject] {
        print("Exercise NAME: \(exercise.value(forKey: "name"))")
        }
    } catch {
        print("Error with request: \(error)")
    }

其他功能是(在id想要输出的地方添加大写字母):

    func configure(_ cell: TodaysRoutineTableViewCell, at indexPath: IndexPath) {
    let userExercise = THE GET EXERCISE FUNCTIONS OUTPUT(at: indexPath)

和另一个:

    fileprivate func updateView() {
    var hasUserExercises = false
    if let UserExercise = THE GET EXERCISE FUNCTIONS OUTPUT {
        hasUserExercises = UserExercise.count > 0
    }

我想也许id只是在那里添加queryResults并且它会很好,但是因为那个函数本地我只是得到错误。什么是正确的方法来实现这一目标?

已更新以显示错误图片

enter image description here

    // MARK: - COREDATA FETCH

func getExercises(completion: (([NSManagedObject]?, NSError?) -> Void)?) {

    guard let managedObjectContext = managedObjectContext else { return }
    let userExercise = UserExercise(context: managedObjectContext)

    let request: NSFetchRequest<UserExercise> = UserExercise.fetchRequest()
    request.predicate = NSPredicate(format: "usersroutine == %@", self.routineName)

    do {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext

        let exercises: [NSManagedObject]?

        do {
            let queryResults = try context.fetch(request)
            print(queryResults)

            for exercise in queryResults as [NSManagedObject] {
                print("Exercise NAME: \(exercise.value(forKey: "name"))")
            }
            completion(exercises, nil)

        } catch {
            print("Error with request: \(error)")
            completion(exercises, error)
        }
    }
}

2 个答案:

答案 0 :(得分:0)

以非同步方式获取可以执行的操作,正确的方法是使用完成块(回调)。

所以你的getExercises函数可以有一个完成块参数,例如:

func getExercises(completion: ((exercises: [String], error: NSError?) -> Void)?)

然后,当您的数据在getExercises函数内准备就绪时,您可以按如下方式调用完成块:

completion?(exercises, error)

完成之前的这个问号是因为完成块是一个可选参数,所以你可以传递这个块,不管你是不是。

可能需要对Swift 3进行一些更新,只需检查完成块的语法。

编辑:在调用时,您需要传递一个闭包作为getExercises函数的参数:

getExercises(completion: { (exercises, error) in
   //Do what you want with the result, this is the result of getExercises
   print(exercises)

})

现在,在getExercises中,您将结果传递给闭包:

func getExercises() {
    // ...
    do {
        // ...
        completion(exercises, nil)
    } catch {
        print("Error with request: \(error)")
        completion?([], error)
    }
}

练习将是某种类型,不确定你在那里处理什么,我放置了一个String数组作为例子。

答案 1 :(得分:0)

  
      
  1. 使用未解析的标识符&#39;练习&#39;
  2.   

根据您在图片中显示的代码,您首次出错的原因是,您使用了尚未声明的属性exercises。您的exercises关闭参数中的completion将无法在该函数中访问。它是一个需要传递给该闭包的参数。

当您调用完成块时,您必须在获取结果后将NSManagedObject数组传递给它。在您的情况下,在该for..in循环内构造一个数组,并在该循环之后调用完成块。

let exercises: [NSManagedObject]?

do {
    let queryResults = try context.fetch(request)
    print(queryResults)

    for exercise in queryResults as [NSManagedObject] {
        //Using the result, build the exercises array here
    }

    completion(exercises, nil)
} catch {
     print("Error with request: \(error)")
    completion(exercises, error)
}
  
      
  1. Nil与预期参数类型不兼容&#39; [NSManagedObject]&#39;
  2.   

这是因为exercises参数不是可选的,但是您将nil传递给它。您必须将exercises参数设置为可选,以获取非零值和零值。将您的方法签名更改为以下内容:

func getExercises(completion: ((exercises: [NSManagedObject]?, error: NSError?) -> Void)?)

注意:确保在传递给nil函数的完成闭包中正确处理getExercises