2016-09-23 12 views
0

私は、公開メソッドを持つRealmオブジェクト(LFEMemory)を持っています。ObjC Realmスレッディング問題

パブリッシュメソッドを呼び出すと、イメージをAWSにアップロードしてからAmazonで返されたURLでオブジェクトを更新する必要があります。

問題は、ブロックがAWSから返ってきたときに、自分の自己LFEMemoryオブジェクトがスレッドセーフではなくなったことです。 (実際は通常は通常のアプリの実行中ですが、App Extensionを使用している場合は決してありません)。

これを解決するには、realmオブジェクトからpublishメソッドを削除し、新しいスレッドで新しいレルムオブジェクトをフェッチできるコントローラオブジェクトでこれを処理します。しかし、それはブロックを呼び出すたびに新しい領域を作成する必要があることを意味します。これは確かに良い方法ではありません。

この状況をどのように処理するのですか?

- (void)publishWithBlock:(ResultBlock)block { 

    FileUploadManager *manager = [[FileUploadManager alloc] init]; 
    [manager uploadWithSuccess:^(NSString *filename) { 

     //self is no longer thread-safe and will cause a crash 
     self.media.path = filename; 

    } failure:^(NSError *error) { 
     block(NO, error); 
    }; 
} 

答えて

1

あなたが探索することができ、さまざまなオプションがあります。

1)あなたのオブジェクトは、主キー(文字列または数値)は、メソッド内の定数としてIDを格納し、取得するためにそれを使用することができますを持っている場合[Realm objectOfType:forPrimaryKey:]を使用して、任意のスレッドからオブジェクトを戻します。 docs

あなたがする必要がある場合は、別のスレッドから新しい領域を取得することを恐れてはいけません。つまり、 "別の"領域を作成したり、ファイルを複製したりしません。

2)プライマリキーがない場合は、メインスレッドにself.mediaを簡単に作成できます。アップロードが完了すると、再びメインキューに切り替えてオブジェクトを変更します。 Realmオブジェクトは、メインスレッド上のすべてのパフォーマンスに影響を与えません。

さらに - あなたはそれがすでに元レルムに作成/ docs

まだそのrealmプロパティからオブジェクトを読み取るために使用されるアクセスすることができます(self.mediaのように)あなたのオブジェクトへのアクセス権を持っている場合 - 私は行くだろうオブジェクトの主キーを使用して、疑わしい場合に必要なオブジェクトへの参照を再フェッチします。

関連する問題