访问核心数据实体时出现严重超额费用

时间:2019-04-01 10:49:30

标签: core-data swift4 exc-bad-access

我正在尝试从某个实体获取一些记录,但是当尝试频繁获取时,我遇到了Bad Access错误,并且应用程序崩溃了。请帮忙。

 var mContext:NSManagedObjectContext! = appDelegate.persistentContainer.viewContext


 func getAllRoomName() -> [String] {

        let fetchRequest: NSFetchRequest<SwitchMO> = SwitchMO.fetchRequest()

        var arrRoomNames = [String]()

        do {
           if let  arrSwitchesMo = try? mContext.fetch(fetchRequest) as? [SwitchMO]
           {

            for switchMo in arrSwitchesMo ?? []
            {
                arrRoomNames.append(switchMo.roomName ?? "")
            }

            }

        } catch {
            print("Error with request: \(error)")
        }

        arrRoomNames = Array(Set(arrRoomNames))
        return arrRoomNames;
    }

访问错误

enter image description here

我该如何摆脱它,请帮助我。

1 个答案:

答案 0 :(得分:0)

如果您使用特定的提取请求,则类型转换是多余的。如果您使用的是do catch,请不要try?

func getAllRoomName() -> [String] {

    let fetchRequest: NSFetchRequest<SwitchMO> = SwitchMO.fetchRequest()

    var arrRoomNames = [String]()

    do {
       let arrSwitchesMo = try mContext.fetch(fetchRequest)
       for switchMo in arrSwitchesMo {
            arrRoomNames.append(switchMo.roomName ?? "")
       }
       arrRoomNames = Array(Set(arrRoomNames))

    } catch {
        print("Error with request: \(error)")
    }
    return arrRoomNames
}

但是,如果该函数本身包含throw ing函数

,则应使该函数可以抛出
func getAllRoomName() throws -> [String] {

    let fetchRequest: NSFetchRequest<SwitchMO> = SwitchMO.fetchRequest()

    var arrRoomNames = [String]()
    let arrSwitchesMo = try mContext.fetch(fetchRequest)
    for switchMo in arrSwitchesMo {
        arrRoomNames.append(switchMo.roomName ?? "")
    }
    return Array(Set(arrRoomNames))
}

如果代码仍然崩溃,则托管对象上下文为nil。按照Core Data模板中的建议声明上下文非可选