1

私はレルムを初めて使用し、「間違ったスレッドからアクセスされたレルム」エラーを受け取ります。取得元と同じレルムのデータにアクセスする必要があることを読みました。ただし、オブジェクトに正常にアクセスできた後、このエラーが発生します。ここにいくつかのコードがあります:

func retrieveApplicationData(completionBlock: (Results<Application>, NSError?) -> Void) {
        let realm = try! Realm()
        let applications = realm.objects(Application)

        if applications.count > 0 {
            completionBlock(applications, nil)
        }   
}

このメソッドは、以下を使用してアプリケーションの配列を作成するメソッドを呼び出します。let array = Array(results)

次に、これを配列を設定するメソッドに渡します。

func setApplicationItems(items: [Application]) {
    applications = items

    print(applications)
}

上記の方法では、配列を出力していますが、うまくいきます。ただし、サイクルの後半で、tableViewDatasource メソッド cellForRowAtIndexPath が呼び出されます。ここでは、applications 配列を使用しようとしていますが、アプリケーションが「不正なスレッド」エラーでクラッシュします。メソッドは次のとおりです。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    print("\(applications)")

    let cell = ApplicationTableViewCell(style: .Subtitle, reuseIdentifier: nil)
    let application = applications[indexPath.row]
    cell.configureCell(application)

    return cell
}

ご覧のとおり、上記のメソッドに print ステートメントを追加しました。ここにアプリケーション配列を印刷しようとすると、クラッシュします。

設定している方法で印刷できるのに、なぜクラッシュするのですか?cellForRowAtIndexPathメインスレッドで呼び出されたからですか?もしそうなら、どうすればtableViewこのインスタンスで更新できますか? 乾杯。

========

編集:

で次のことを行うとcellForRowAtIndexPath、空の結果が返されます。

let realm = try! Realm()
let applicationsB = realm.objects(Application)

編集2:

クロージャーでの保存を処理します。データが返されたときに使用してメインスレッドに戻そうとしましdispatch_asyncたが、まだクラッシュしていました。ただし、これdispatch_asyncを self.tableView.reloadData() を呼び出す直前に移動しました。クラッシュしなくなったのは良いことですが、データが常に利用できるとは限りません。ブレークポイントを使用して速度を落とすと、データが返されます。ただし、実行させただけではデータはありません。バックグラウンド スレッドに保存されたデータがメイン スレッドでいつ利用可能になるかを知る方法はありますか?

私が使用しているコードは次のとおりです。

 dispatch_async(dispatch_get_main_queue()) {               
            let realm = try! Realm()
            realm.refresh()
            let applicationsB = realm.objects(Application)
            let array = Array(applicationsB)
            self.tableViewDataSource.setApplicationItems(array as! [Application])
            self.tableView.reloadData()
        }

データは常に存在するとは限りません。

編集3:

save メソッドを a でラップしたところ、dispath_async(dispath_get_main_queue())正常に動作しました。

    dispatch_async(dispatch_get_main_queue()) {

            let realm = try! Realm()
            try! realm.write() {

            let applications = data.map({ (object) -> Application in
                return Application(applicationID: object.applicationID, contact: "", state: "", jobBoard: object.jobBoard, salary: object.salary, title: object.title, location: "")
            })

            for application in applications {
                print(application)
                realm.add(application)
            }

            //try! realm.commitWrite()

            completionBlock(true, nil)

        }
4

1 に答える 1

0

編集:

以下の bdash からのコメントをお読みください。これは機能しますが、実際には偶然にすぎません。他の人が同じことを試さないように、ここに答えを残してください。

次のコードは機能しましたが、正しくありません!!!:

だから私はそれを機能させることができました。最初にアプリを停止すると、データをフェッチしたコードが表示されます。これはうまくいきました。そのため、データがデータベースにあることはわかっていました。ただし、データを保存してすぐに使用したかったのです。

これを実現するには、ブロックtry! realm.commitWrite()内に次を追加する必要がありました。realm.write() { }以下の完全な方法:

try realm.write() {

       let applications = data.map({ (object) -> Application in
                return Application(applicationID: object.applicationID, contact: "", state: "", jobBoard: object.jobBoard, salary: object.salary, title: object.title, location: "")
        })

        for application in applications {
            print(application)
            realm.add(application)
        }

        try! realm.commitWrite() // *NOTE* Here is the code I added.

        completionBlock(true, nil)

    }

commitWrite() を追加すると、後でメインスレッドで次のようにフェッチできるようになりました。

 dispatch_async(dispatch_get_main_queue()) {

            let realm = try! Realm()
            realm.refresh()
            let applicationsB = realm.objects(Application)
            let array = Array(applicationsB)

            self.tableViewDataSource.setApplicationItems(array as! [Application])


            self.tableView.reloadData()
        }
于 2016-06-27T15:21:41.463 に答える