在另一个函数中使用函数的输出?
我有一个获取请求,我想使用结果来通知其他功能。抓取是在另一个函数中使用函数的输出?
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在那里,它会很好,但作为本地功能,我只是得到错误。什么是实现这一目标的正确方法?
更新,以显示错误的图像
// 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为例。
- 使用未解决的识别符的“练习”
基于第一误差是,你已经使用了属性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)
}
开始=>
- 无不与预期参数类型兼容 '[NSManagedObject]'
这是因为exercises
参数不是一个可选的,但你正在通过nil
它。您必须将exercises
参数设置为可选,以同时采用非零值和零值。你的方法的签名更改为以下:
func getExercises(completion: ((exercises: [NSManagedObject]?, error: NSError?) -> Void)?)
注:确保妥善处理nil
在完成关闭你传递给getExercises
功能。
我尝试过这些并用屏幕截图更新OP,我只是有大量的错误?对不起,如果我做了一个愚蠢的错误,即时编写这些funcs的新手 – infernouk
对不起,你有第一个错误是由于Swift 2和Swift 3之间的差异。你可以在参数名称之前加上“_”或删除这个论点,让我们只是这个类型。 关于第二个问题,您需要将您想要的数据传递给您的关闭。您还需要将闭包传递给getExcercise方法。我正在用一个例子编辑答案。 – fray88
谢谢,我很困惑作为一个获取将返回实体结果对象而不是数组的字符串?也许我误解了 – infernouk