【问题标题】:SIGABRT Error When I Sending Data to Kinvey向 Kinvey 发送数据时出现 SIGABRT 错误
【发布时间】:2016-04-12 14:50:10
【问题描述】:

为什么我的数据没有发送到 Kinvey 后端?我的应用程序不断崩溃,我收到 SIGABRT 错误。我尝试将 String 更改为 NSString 但这没有帮助。出于某种原因,我在 Kinvey 中的仪表板确实显示了 API 调用和数据存储,但它没有存储任何内容(我是初学者)。

import UIKit

class ReservationViewController: UIViewController {

    @IBOutlet weak var userName: UITextField!
    @IBOutlet weak var userEmail: UITextField!
    @IBOutlet weak var userSeat: UITextField!
    @IBOutlet weak var userDateTime: UIDatePicker!

    @IBAction func sendReservation(sender: AnyObject) {
        // STORE DATA
        let store = KCSAppdataStore.storeWithOptions([
            KCSStoreKeyCollectionName : "userReservation",
            KCSStoreKeyCollectionTemplateClass : Booking.self
        ])
        let reservation = Booking()
        reservation.name = userName.text
        reservation.email = userEmail.text
        reservation.seats = userSeat.text
        reservation.date = NSDate(timeIntervalSince1970: 1352149171) //sample date
        store.saveObject(
            reservation,
            withCompletionBlock: { (objectsOrNil: [AnyObject]!, errorOrNil: NSError!) -> Void in
                if errorOrNil != nil {
                    //save failed
                    NSLog("Save failed, with error: %@", errorOrNil.localizedFailureReason!)
                } else {
                    //save was successful
                    NSLog("Successfully saved event (id='%@').", (objectsOrNil[0] as! NSObject).kinveyObjectId())
                }
            },
            withProgressBlock: nil
        )
    }

    class Booking : NSObject {    //all NSObjects in Kinvey implicitly implement KCSPersistable
        var entityId: String? //Kinvey entity _id
        var name: NSString?
        var email: NSString?
        var seats: NSString?
        var date: NSDate?

    }

    override func hostToKinveyPropertyMapping() -> [NSObject : AnyObject]! {
        return [
            "entityId" : KCSEntityKeyId, //the required _id field
            "name" : "name",
            "email" : "email",
            "seats" : "seats",
            "date" : "date",
        ]
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

【问题讨论】:

    标签: database swift kinvey


    【解决方案1】:

    如果这实际上是您的代码,而不仅仅是您在复制粘贴时犯的错误,那么问题是您的 Booking 类当前是您的 ReservationViewController 中的一个嵌套类,并且您将 hostToKinveyPropertyMapping 实现为一种方法ReservationViewController.

    相反,为您的 Kinvey 类创建一个新文件:

    class Booking: NSObject {
        var entityId: String? //Kinvey entity _id
        var name: NSString?
        var email: NSString?
        var seats: NSString?
        var date: NSDate?
    
        override func hostToKinveyPropertyMapping() -> [NSObject : AnyObject]! {
            return [
                "entityId" : KCSEntityKeyId, //the required _id field
                "name": "name",
                "email": "email",
                "seats": "seats",
                "date": "date"  //You also had an extra comma after the last item of this dictionary.
            ]
        }
    }
    

    然后从您的视图控制器中删除该代码。此外,请确保您安全地打开所有可选值,并确认您的集合确实被命名为“userReservation”。

    【讨论】:

    • 很抱歉没有早点回复我过去 3 周一直在度假,我这周回来后会尽快测试这个!,我仍然对创建一个你的意思有点困惑新文件?
    • 没问题,我只是在开玩笑!我的意思是你应该在你的 XCode 项目中添加一个新的 Swift 文件,并将 Booking 类的代码放在那里,只是为了清楚地将它与你的 ReservationViewController 分开。我认为它们应该是两个完全独立的类。
    • 如果代码在新类中且未连接到预留视图控制器,我如何调用代码?对不起,我对这个有点陌生...
    • 您可以按照现在的方式进行操作:let booking = Booking(),然后您可以随意操作您的预订对象。在像 Xcode 这样的 IDE 中工作时,为每个类创建一个单独的文件是一种常见的做法。
    猜你喜欢
    • 2020-11-22
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2016-05-14
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多