【发布时间】:2018-01-23 16:38:10
【问题描述】:
谁能帮我修复我的 API 调用函数。我解析数据并将其存储在结果中,如果在解析时出现任何错误,我会抛出一个失败的 json 错误。如果解析成功,那么我将数据保存在数据库中。 但是我的应用在 json 解析失败后在这一行崩溃了
return completion(.failure(.jsonError("Values of expenses not found")))
这是我的全部功能:-
func loadExpenseOfReport(organizationID: Int, reportID: Int, completion: @escaping (Result) -> Void) {
self.remote.loadExpensesOfReport(organizationID, reportID: reportID) { result in
switch result {
case .success(let json):
var result : (json: [[String: Any]], ids: [Int])
do {
result = try Expense.processExpenses(JSON: json!, organizationID: Int(self.user.organization.organizationID))
} catch let error {
return completion(.failure(.jsonError("Values of expenses not found"))) // App crashes here
}
print("result \(result)")
// Save in database
self.dataStack.enqueueCoreDataBlock({ context in
Sync.changes(result.json, inEntityNamed: "Expense", predicate: nil, parent: nil, parentRelationship: nil, inContext: context, operations: .all, completion: { error in
guard error == nil else {
return completion(.failure(.syncError(error!)))
}
return completion(.success(nil))
})
})
//return completion(.success(nil))
case .failure(let error):
return completion(.failure(error))
}
}
但是当我将上述保存在数据库中的行更改为此时,它不再崩溃了。
//self.dataStack.enqueueCoreDataBlock({ context in
Sync.changes(result.json, inEntityNamed: "Expense", predicate: nil, parent: nil, parentRelationship: nil, inContext: self.dataStack.viewContext, operations: .all, completion: { error in
guard error == nil else {
return completion(.failure(.syncError(error!)))
}
return completion(.success(nil))
})
//})
【问题讨论】:
-
您应该在调用
completion之前删除return语句。你的函数返回 void,所以你不能返回任何东西,而且闭包在被completion(...)调用时被“返回”。 -
谢谢@DávidPásztor,你能帮帮我吗,我已经编辑了这个问题。我注释掉这两行,而不是将其保存在上下文中,而是将其保存在 self.dataStack.viewContext 中,一切正常。