2017-02-22 53 views
0

Я пытаюсь установить базу данных Realm, и все работает до сих пор. Теперь, когда я пытаюсь создать маркер уведомления для того, чтобы отслеживать изменения в моем царстве, метод addNotificationBlock возвращает следующую ошибку:Realm addNotificationBlock возвращающая ошибка

Error Domain=io.realm Code=1 "std::exception" UserInfo={NSLocalizedDescription=std::exception, Error Code=1} 

Я прочитал ссылку API, и я понимаю, что:

This can only currently happen if opening the Realm on a background thread to calcuate the change set fails.

К сожалению, это не помогает мне выяснить причину возникновения такого сбоя. В моем приложении у меня есть база данных Realm из 100 объектов, и я пытаюсь представить каждый объект, где переменная location = 2. Я хотел бы слушать уведомления об изменениях в объекте Results, содержащем все эти объекты.

код в моем ViewController:

import UIKit 
import RealmSwift 

class PatientCell: UITableViewCell { 

    @IBOutlet weak var hetu: UITextView! 
    @IBOutlet weak var name: UITextView! 
    @IBOutlet weak var photo: UITextView! 

} 

class PäivystyslistaVC: UIViewController, UIScrollViewDelegate, UITableViewDelegate, UITableViewDataSource, UIPopoverControllerDelegate { 

    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet var patientPopupView: UIView! 

    var patients: Results<Patient2>! 
    var realm = try! Realm() 
    var timer: Timer! 
    var notificationToken: NotificationToken? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.dataSource = self 
     tableView.delegate = self 
     let realm = try! Realm() 
     patients = realm.objects(Patient2.self).filter("location = 2") 

     print("Patients on the ER: \(patients)") 

     notificationToken = patients.addNotificationBlock { (changes: RealmCollectionChange) in 
      switch changes { 
      case .initial: 
       print("From initial") 
       break 
      case .update: 
       print("From update") 
       break 
      case .error(let err): 
       print("Error occured \(err)") 
       break 
      } 
     } 

     timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.addPatient), userInfo: nil, repeats: true) 
    } 

    func addPatient() { 
     print("") 
     print("Timer launched") 
     print("Patients on the ER: \(patients.count)") 
     sendPatientToER() 
     print("") 
     tableView.reloadData() 
    } 



    // MARK: TableView:n hallinta 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return patients.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "patient", for: indexPath) as! PatientCell 

     let patient = patients[indexPath.row] 
     cell.hetu?.text = patient.hetu 
     cell.name?.text = patient.fullName 
     cell.photo?.text = patient.photo 

     return cell 

    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     let potilastiedotVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PotilastiedotVC") 
     self.present(potilastiedotVC, animated: true, completion: nil) 

     tableView.deselectRow(at: indexPath, animated: true) 
    } 

    func tableView(_ tableView: UITableView, editActionsForRowAt: IndexPath) -> [UITableViewRowAction]? { 
     let kotiuta = UITableViewRowAction(style: .normal, title: "Kotiuta") { action, index in 
      try! self.realm.write { 
       self.realm.create(Patient2.self, value: ["id": index.row, "location": 1], update: true) 
      } 
      self.tableView.deleteRows(at: [index], with: .left) 

     } 
     kotiuta.backgroundColor = UIColor.vihreä 

     let osastolle = UITableViewRowAction(style: .normal, title: "Osastolle") { action, index in 
      try! self.realm.write { 
       self.realm.create(Patient2.self, value: ["id": index.row, "location": 3], update: true) 
      } 
      self.tableView.deleteRows(at: [index], with: .top) 
     } 
     osastolle.backgroundColor = UIColor.oranssi 

     let lähetä = UITableViewRowAction(style: .normal, title: "Lähetä") { action, index in 
      try! self.realm.write { 
       self.realm.create(Patient2.self, value: ["id": index.row, "location": 3], update: true) 
      } 
      self.tableView.deleteRows(at: [index], with: .top) 
     } 
     lähetä.backgroundColor = UIColor.vaaleansininen 

     return [kotiuta, lähetä, osastolle] 
    } 

И вспомогательный метод в другом файле:

import UIKit 
import RealmSwift 

    func sendPatientToER() { 
     let realm = try! Realm() 
     let count = realm.objects(Patient2.self).filter("location == 1").count 
     print("Count of patients waiting at home: \(count)") 
     let randomId = Int(arc4random_uniform(UInt32(count))) 
     print("Random id generated: \(randomId)") 
     realm.beginWrite() 
     realm.create(Patient2.self, value: ["id": randomId, "location": 2], update: true) 
     try! realm.commitWrite() 
    } 

Спасибо заранее.

ответ

1

Непереведенный std::exception не должен выходить из Царства, так что часть является ошибкой.

Если вы можете последовательно воспроизвести проблему, вы можете установить контрольную точку исключения в Xcode для разрыва в точке, где происходит ошибка, и, надеюсь, выяснить, что не так.

+0

Благодарим вас за ответ. Я сделал так, как вы предложили, и точка останова появилась в 'void RealmCoordinator :: pin_version (VersionID versionid)' метод в строке 'm_advancer_sg-> begin_read (versionid);' Это говорит вам что-нибудь? –

+0

Это определенно ошибка в Realm, которую вы должны сообщить на https://github.com/realm/realm-cocoa/issues. –

+0

Спасибо @ Томас Гойне. Я сообщил об этом здесь: https://github.com/realm/realm-cocoa/issues/4693 –

 Смежные вопросы

  • Нет связанных вопросов^_^