2016-05-26 5 views
2

См. Error: Object has been deleted or invalidated. (Realm) Я столкнулся с этой ошибкой и с двумя случаями. Я пытаюсь найти DBProduct перед удалением, но он также получил ошибку: объект был удален или недействителен. Это неправильно? Пожалуйста, помогите мне. Я называю этот метод в блоке зрения оповещения, как случай 2.Объект удален или недействителен. (Realm)

let realm = try! Realm() 
try! realm.write { 
    let dbProduct = realm.objectForPrimaryKey(DBProduct.self, key: product.id) 
    if dbProduct != nil { 
     realm.delete(dbProduct!) 
    } 
} 

Update: Эта проблема происходит на iOS8 только, и это нормально на прошивке 9.

+0

Я думаю, что у вас есть логика неправильного пути. Вы пытаетесь удалить объект из Realm, который уже удален из Realm, но у вас все еще есть POSO, ссылающийся на него. Не видя всего вашего кода, я бы предположил, что этот объект является «продуктом» –

+0

. Я перезагружаю табличное представление и удаляю данные Realm. Но это происходит только на iOS8 и ОК на iOS 9. Я не понимаю эту проблему. – nangtrung

ответ

3

Как правило, эта ошибка должна быть брошена только если вы пытаетесь получить доступ к объекту объекта Realm, который был удален, или если вы явно указали, что его родительский объект Realm недействителен.

Как сказал Джеймс, вполне вероятно, что ваша переменная product уже была признана недействительной, и в этом случае попытка вызвать product.id, скорее всего, приведет к сбою.

Если это так, то проще всего исправить это, чтобы избежать использования переменной product и вместо этого просто сделать копию значения id напрямую. Таким образом, если объект удален/недействителен, у вас все еще есть свой первичный ключ, в котором вы можете проверить, существует ли он еще.

На стороне примечания этот код, безусловно, может быть сделан и более эффективным. Нет необходимости выполнять запросы внутри транзакций записи, и вы должны только открывать транзакцию записи, если на самом деле был объект для удаления (транзакции записи - довольно тяжелые вещи, поэтому их следует избегать как можно больше).

let productID = product.id //save a copy of the ID in case 'product' gets deleted. 

let realm = try! Realm() 

let dbProduct = realm.objectForPrimaryKey(DBProduct.self, key: productID) 
if dbProduct != nil { 
    try! realm.write { 
     realm.delete(dbProduct!) 
    } 
} 

Я надеюсь, что это помогло!

+0

Я тестировал на iOS 9, все в порядке. Тем не менее, крах приложения на iOS 8. – nangtrung

+0

Uh-oh. Это никогда не является хорошим знаком! Что сказал крах? – TiM

+0

Ошибка при сбое: объект был удален или аннулирован. – nangtrung

Смежные вопросы