2017-01-02 3 views
0

runloops内からの通知ブロックを追加することができます。は唯一の私は、コードのこの部分にいくつかのcrashsをしました

SRNetwork.provider 
     .request(SRService.postData(user_id: userId)) 
     .mapArray(STrain.self) 
     .observeOn(ConcurrentDispatchQueueScheduler.init(queue: SDispatchQueue.dataTrain.getQueue())) 
     .subscribe({ (event) -> Void in 
      switch event { 
      case .next(let response): 
       self.train.value = response 
       SRealmTrain.sharedInstance.cacheTrain(response) 
      case .error(let error): 
       SRealmTrain.sharedInstance.fetchTrainRx(userId) //CRASH IS HERE 
        .bindTo(self.train) 
        .addDisposableTo(self.disposeBag) 
       print("\(error)") 
      default: break; 
      } 
     }) 
     .addDisposableTo(disposeBag); 

私はこの問題は、私はMainScheduler.instanceではないよとrxRealmがmain threadが、私に見るということだと思いますそれを望んでいない。それを修正することは可能ですか?

fetchTrainRx

public func fetchTrainRx(_ userId: String) -> Observable<[STrain]> { 

    let predicate = NSPredicate(format: "userId == %@", userId) 

    if let realm = realm { 

     return Observable.from(realm 
      .objects(SRTrain.self) 
      .filter(predicate) 
      .sorted(byProperty: "order", ascending: true)) 
      .map ({ 
       $0.map(STrain.init) 
     }) 
    } 
    return Observable.just([]); 
} 

答えて

2

レルムの通知は、(アプリケーションのデフォルトの実行ループがインストールされている)、メインスレッド上で、デフォルトで配信されます。このため、実行ループのないバックグラウンドスレッドの通知を購読しようとするため、コード内で「runloops内からの通知ブロックのみを追加できます」という例外が発生します。

Observable.from(... some realm collection ...)を使用すると、RxRealmはRealm自身が送信する通知をサブスクライブします。コードはこの行のバックグラウンドスレッドに明示的に切り替えられるため、例外が発生します。.observeOn(ConcurrentDispatchQueueScheduler.init(queue...。あなたの現在の問題を解決するには、2人の別々の道に行くことができ

1)

)あなたは、メインスレッド上のRxのサブスクリプションをやっていると仮定すると(自分の subscribeオペレータの前にバックグラウンドキューに切り替えないでください。

2)fetchTrainRxメソッドの内部にDispatchQueue.main.syncを使用して、メインスレッドでObservableを作成します。

これは現在の問題を解決するはずです。

いずれにしても、あなたのコードからは、レルムのレファレンスをあなたのクラスのどこかに格納していることがわかります(少なくとも、あなたのように見えます)。これはベストプラクティスではありません。別のスレッドで作業している場合は、let realm = try! Realm()を使用して、毎回現在のスレッドでレルム参照を取得します。これにより、常に正しいレルムインスタンスで作業できるようになります。

関連する問題