2016-05-26 4 views
2

Error: Object has been deleted or invalidated. (Realm) 2つのケースでこのエラーが発生しました。 削除する前にDBProductを見つけようとしましたが、エラー:オブジェクトが削除または無効化されています。これは間違っていますか?私を助けてください。この問題はのみiOS8で発生し、それがiOSの9オブジェクトが削除または無効化されています。 (Realm)

+0

あなたはロジックが間違った方法で回っていると思います。すでにレルムから削除されているレルムからオブジェクトを削除しようとしていますが、まだそれを参照しているポーノがあります。あなたのコードをすべて見ることなく、そのオブジェクトは '製品'だと思います。 –

+0

レルムのテーブルビューを再読み込みしてデータを削除します。しかし、それはiOS8のみで起こり、iOS 9ではOKです。私は問題を理解しません。 – nangtrung

答えて

3

通常でOKです、そのエラーが場合にのみスローする必要があります。私は、更新

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

ケース2として、アラートビューのブロックに、このメソッドを呼び出します削除されたRealmオブジェクトのプロパティにアクセスしたり、親Realmオブジェクトに明示的に無効化するように指示した場合は、アクセスしてください。

枚ジェームズは、それがproduct.id可能性が高いこと、クラッシュを引き起こす呼び出そうとした場合には、お使いのproduct変数が既に存在無効になっていたことは非常に可能性があります、と述べました。

これを修正するには、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

関連する問題