2016-11-16 3 views
3

コアデータは、問題を引き起こしている変更されたオブジェクトを自動的に更新し、必要以上に混乱させます。コアデータオブジェクトのコピーを作成する方法(手を触れないでください)

は、私はこのコードのビットを持って言う:

let fetchRequest = Track.fetchRequest() 

//update it 
do { 
    let tracksFound = try self.managedObjectContext.fetch(fetchRequest) as! [Track] 
    print("retrieved") 

    let trackToUpdate = tracksFound[0] 

    trackToUpdate.locality = "please dont have updated" 

    do { 
     try self.managedObjectContext.save() 
     print("saved") 
    } 
    catch { 
     fatalCoreDataError(error) 
    } 

    for t in tracksFound { 
     print(t.locality) 
    } 
} 
catch { 
    fatalCoreDataError(error) 
} 

あなたはそれが[Track]オブジェクト配列は、それが適切にlocalityplease dont have updatedとの最初の要素を更新フェッチ見ることができます。次に、このオブジェクトを保存します。最後に、最初に定義された配列tracksFoundを読み込みます。私はtracksFoundが手つかずのままになると予想していましたが、オブジェクトtracksFound[0].localityplease dont have updatedに変更されました。

コアデータがオブジェクトを更新しないようにするにはどうすればよいですか?私は基本的にそのままコピーされるtracksFoundのコピーを作成したいので、後で意思決定に使うことができます。マイケルさんのコメントで述べたように

おかげ

+0

save()メソッドが呼び出されなかった場合、単純にオブジェクトは変更されません。 –

+0

コード 'let trackToUpdate = tracksFound [0]'は、コピーではなくその要素に対する*参照*を取得します。したがって、 'trackToUpdate'を変更すると、実際に' tracksFound [0] 'が変更されています。 – Michael

+0

@Karthickいいえ、これの横には危険です。 –

答えて

2

は、trackToUpdateNSManagedObjectのインスタンスへの参照です。同じオブジェクトを指している異なる参照は、...同じオブジェクトを指します。したがって、他のものがないので、あるオブジェクトを変更して、他のオブジェクトをそのままにする方法はありません。スウィフトは意図をもって参照を難読化しています。

あなたが言うように、コピーを作成する必要があります。 NSManagedObjectNSCopyingプロトコルを実装していません。正当な理由があります:インスタンスが他のインスタンス(リレーション)を参照している場合は、そのインスタンスをコピーするかどうかを決定する必要があります。そうすることで、グラフ全体をコピーする危険性があります。そうしないと、元の問題に戻り、参照されたインスタンスを共有します。あなたは決定を下さなければなりません。

プロパティを単純な辞書にコピーする方がよい場合があります。新しいインスタンスを作成すると、これはオブジェクトグラフの一部になります。これは、「短い時間」の管理対象を持つコードのようなものです(用語が難しいかもしれません)。

ただし、新しいインスタンスを作成できます。次に、-entityを介してオブジェクトのエンティティの説明を取得します。エンティティの説明にはすべてのプロパティのリストを含む-propertiesというプロパティがあります。これを使用すると、ソースプロパティを反復して新しいインスタンスに格納できます。 Objective-Cのキーバリューコーディングのおかげで、実行時にそれを行うことができます。

+0

これを説明してくれてありがとう! – toast

関連する問題