领域导致程序的行为出乎意料.(OS X和Swift)



所以我创建了一个相当简单的程序,使用Realm作为我的数据库。我对Swift(或任何OS X或iOS环境)编程相当陌生。在我的程序中,当按钮按下IBAction func createInvoice时,我想要发生一些事情,我想要计数数据库中的前几行并创建一个发票号,我想要向数据库写入新数据,我想调用一个新的视图和视图控制器并传递发票号。我的代码工作,除了一件事,当使用Realm新的视图控制器被称为(override func prepareForSegue)之前,发票号码被创建,所以一个0值被传递到新的视图控制器。

如果我创建一个假发票号码值,如let invoicenumber = 42,一切工作完美。似乎是Realm导致事情发生"无序",我怎么能让viewcontroller在加载前等待一个值?

@IBAction func createInvoice(sender: AnyObject) {
 let realm = Realm()
let invoicepull = Invoice()
let invoicecount = realm.objects(Invoice)
let invoicenraw = invoicecount.count
let a = 100
let invoicenumber = a + invoicenraw
var invoicefile = Invoice()
invoicefile.inumber = invoicenumber
invoicefile.cnumber = clientcombo.stringValue
invoicefile.cost = owed.doubleValue
invoicefile.paid = paid.doubleValue
invoicefile.sevicecode = service.stringValue
invoicefile.dateofservice = NSDate()
// Save your object
realm.beginWrite()
realm.add(invoicefile)
realm.commitWrite()
//Sent notification
performSegueWithIdentifier("cinvoiceseuge", sender: nil)
println("Inside Action")
println(invoicenumber)
dismissViewController(self)
}
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "cinvoiceseuge") {
    //Checking identifier is crucial as there might be multiple
    // segues attached to same view
    var detailVC = segue.destinationController as! invociegenerator;
    detailVC.toPass = invoicenumber
    println("Inside Sugue")
    println(invoicenumber)
}
} 

如果createInvoice发生在与prepareForSegue不同的线程上,您必须在访问invoicenumber变量(我假设是RealmSwift.Object类型)之前刷新领域(Realm().refresh())。

我已经解决了这个问题,感谢@ schmidt通过使用Realm的内置通知中心的帮助。要使用通知,可以使用这个基本结构。

var notificationToken: NotificationToken?
deinit{
let realm = Realm()
if let notificationToken = notificationToken{
    realm.removeNotification(notificationToken)
}
}
override func viewDidLoad() {
super.viewDidLoad()
let realm = Realm()
notificationToken = realm.addNotificationBlock { note, realm in
   println("The realm is complete")
}
...
}

我的代码中的另一个小错误是let invoicenumber = a + invoicenraw,我需要删除let,因为它是一个变量而不是常量。

最新更新