Неправильное превышение при доступе к основным данным - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь получить какую-то запись от какой-либо сущности, но при частой выборке я получаю ошибку 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 голосов
/ 01 апреля 2019

Если вы используете определенный запрос на выборку, приведение типа является избыточным. И если вы используете 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 функцию

.
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. Объявите контекст необязательным , как предлагается в шаблоне базовых данных.

...