2016-11-21 16 views
0

私はこのようになります私のレルムオブジェクトの進展プロパティを更新しようとしている:更新アップロードの進捗

class Upload: Object { 

    dynamic var name: String = "" 
    dynamic var key: String = "" 
    dynamic var localIdentifier:String = "" 
    dynamic var data: NSData? = nil 
    dynamic var albumKey: String = "" 
    dynamic var isUploading: Bool = false 
    dynamic var status: String = "" 
    dynamic var progress: Float = 0.0 
    dynamic var urlString: String = "" 
    let isVideo = RealmOptional<Bool>() 

    override static func primaryKey() -> String? { 
     return "localIdentifier" 
    } 
} 

私がアップロードの進行状況の更新ごとに0.5を与える使用していますフレームワーク約秒。コールバックは、次のようになります。上記のコードでは

task.observe(.progress) { snapshot in 
      let float = Float(snapshot.progress!.fractionCompleted) 
      self.update(progress: float, forUpload: upload) 
     } 

fileprivate func update(progress: Float, forUpload upload: Upload) { 
     do { 
      let realm = try Realm() 
      let u = Upload() 
      u.progress = progress 
      u.localIdentifier = upload.localIdentifier 
      try realm.write { 
       realm.add(u, update: true) 
      } 
     } catch { 
      print(error) 
     } 
    } 

、それがクラッシュし、私に「RLMException」を与え、その理由続ける:「レルムは、ライト・トランザクションですでに」です。

私は私が実行している3件の同時ダウンロードを持っている、または問題のオブジェクトがビジー状態であるので、(私は同じ主キーとそれを割り当てる新しいオブジェクトを作成すると、これを軽減することを考えた?)

ため、このエラーが発生したかどうかを知っている」いけません

私の質問は、これについてどうすればいいですか?私は、あなたがレルムを使用するものの外に少しあることをしようとしていますか?

+0

'update()'が呼ばれるたびに新しい 'Upload'オブジェクト全体を作成する根拠は何ですか?既存の 'Upload'オブジェクトを渡しているので、' progress'の新しい値を既存の 'upload'に書き込むほうが理にかなっていると思います。 – AustinZ

答えて

1

task.observeが別のスレッドで非同期で実行されていると仮定すると、同じスレッド上でupdateが実行されているため、2回実行することができます。一番簡単な方法は、メインスレッド上で、それを実行している強制的に次のようになります。

task.observe(.progress) { snapshot in 
      let float = Float(snapshot.progress!.fractionCompleted) 
      DispatchQueue.main.sync { 
       self.update(progress: float, forUpload: upload) 
      } 
     } 

私もそう、彼らは別のスレッドからアクセスされるため、新しいUploadインスタンスを毎回作成していることを推測しています。メインスレッドで実行すると、1つのインスタンスの進行状況を更新することができます。

+0

バックグラウンドシリアルキューへのディスパッチは、メインスレッドをブロックすることなく、同じ効果を持ちます。 – jpsim

関連する問題