【问题标题】:App crashing in completion handler with EXC_BAD_ACCESS error应用程序在完成处理程序中崩溃并出现 EXC_BAD_ACCESS 错误
【发布时间】: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 中,一切正常。

标签: ios swift core-data


【解决方案1】:

您不需要“返回”完成块。就这样称呼它:

var result : (json: [[String: Any]], ids: [Int])
           do {
               result = try Expense.processExpenses(JSON: json!, organizationID: Int(self.user.organization.organizationID))
           } catch let error {
               completion(.failure(.jsonError("Values of expenses not found")))
           }

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多