我有一个获取请求,我想使用结果来通知其他功能。获取是
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)
}
}
}
答案 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)
- 使用未解析的标识符&#39;练习&#39;
醇>
根据您在图片中显示的代码,您首次出错的原因是,您使用了尚未声明的属性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)
}
- Nil与预期参数类型不兼容&#39; [NSManagedObject]&#39;
醇>
这是因为exercises
参数不是可选的,但是您将nil
传递给它。您必须将exercises
参数设置为可选,以获取非零值和零值。将您的方法签名更改为以下内容:
func getExercises(completion: ((exercises: [NSManagedObject]?, error: NSError?) -> Void)?)
注意:确保在传递给nil
函数的完成闭包中正确处理getExercises
。