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

问题描述:

我有一个获取请求,我想使用结果来通知其他功能。抓取是在另一个函数中使用函数的输出?

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) 
     } 
    } 
} 

被取东西,你可以在一个异步的方式做的,正确的方法是使用一个完成的块(回调)。

所以你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) 
    } 
} 

练习将是某种类型,不知道你在那里处理什么,我放置了一个arr以字符串ay为例。

+0

我尝试过这些并用屏幕截图更新OP,我只是有大量的错误?对不起,如果我做了一个愚蠢的错误,即时编写这些funcs的新手 – infernouk

+0

对不起,你有第一个错误是由于Swift 2和Swift 3之间的差异。你可以在参数名称之前加上“_”或删除这个论点,让我们只是这个类型。 关于第二个问题,您需要将您想要的数据传递给您的关闭。您还需要将闭包传递给getExcercise方法。我正在用一个例子编辑答案。 – fray88

+0

谢谢,我很困惑作为一个获取将返回实体结果对象而不是数组的字符串?也许我误解了 – infernouk

  1. 使用未解决的识别符的“练习”

基于第一误差是,你已经使用了属性exercises这是已在图像中示出的代码,原因为你尚未宣布。您的completion中的exercises将无法​​在该函数内访问。它需要传递给该闭包的参数。

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

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. 无不与预期参数类型兼容 '[NSManagedObject]'
开始=>

这是因为exercises参数不是一个可选的,但你正在通过nil它。您必须将exercises参数设置为可选,以同时采用非零值和零值。你的方法的签名更改为以下:

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

注:确保妥善处理nil在完成关闭你传递给getExercises功能。

+0

感谢我试图实现这一点,但仍然有一堆错误,我用图像更新了OP,以显示我的代码和错误 – infernouk

+0

如果您可以将该函数作为代码发布,编辑会很有帮助。 –

+0

添加下方的代码图像谢谢 – infernouk