ios - 在简单的应用程序中使用 Firebase 的 Swift - lldb 错误

标签 ios swift firebase firebase-realtime-database

我一直在关注官方 Firebase Youtube 帐户 ( https://www.youtube.com/watch?v=joVi3thZOqc ) 上的教程,但它似乎已经过时,所以我不得不阅读文档并应用一些更改才能使这个简单的应用程序正常工作。我在 AppDelegate.swift 文件中收到 lldb 错误:

import UIKit
import Firebase
import FirebaseDatabase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { //error here

    var window: UIWindow?

    override init(){
        FIRApp.configure()
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

ViewController.swift 文件:

import UIKit
import Firebase
import FirebaseDatabase

class ViewController: UIViewController {

    //FBDataBase variables
    var ref: FIRDatabaseReference = FIRDatabase.database().reference() //root directory

    //interface variables
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        ref.observe(.value) { (snapshot) in
            self.label.text = snapshot.value as? String
        }
    }

    //interface functions
    @IBAction func sunnyPressed(_ sender: Any) {
        ref.child("condition").child("addedByUser").setValue("sunny")
    }

    @IBAction func foggyPressed(_ sender: Any) {
        ref.child("condition").child("addedByUser").setValue("foggy")

    }
}

控制台日志:

2017-02-05 13:12:40.738 fireDataBaseTest[4745:140438] Firebase automatic screen reporting is enabled. Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name. To disable automatic screen reporting, set the flag FirebaseAutomaticScreenReportingEnabled to NO in the Info.plist
2017-02-05 13:12:40.848 fireDataBaseTest[4745] <Debug> [Firebase/Core][I-COR000001] Configuring the default app.
2017-02-05 13:12:40.864 fireDataBaseTest[4745:] <FIRAnalytics/INFO> Firebase Analytics v.3600000 started
2017-02-05 13:12:40.865 fireDataBaseTest[4745:] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/...)
2017-02-05 13:12:40.870: <FIRInstanceID/WARNING> FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
2017-02-05 13:12:40.913 fireDataBaseTest[4745:] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2017-02-05 13:12:41.027 fireDataBaseTest[4745:140438] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<fireDataBaseTest.ViewController 0x7fd09e60e1f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key foggyPressed.'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001110cdd4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x0000000110b2f21e objc_exception_throw + 48
    2   CoreFoundation                      0x00000001110cdc99 -[NSException raise] + 9
    3   Foundation                          0x000000011063d9df -[NSObject(NSKeyValueCoding) setValue:forKey:] + 291
    4   UIKit                               0x0000000111d9f293 -[UIViewController setValue:forKey:] + 88
    5   UIKit                               0x000000011201379e -[UIRuntimeOutletConnection connect] + 109
    6   CoreFoundation                      0x00000001110729e0 -[NSArray makeObjectsPerformSelector:] + 256
    7   UIKit                               0x0000000112012122 -[UINib instantiateWithOwner:options:] + 1867
    8   UIKit                               0x0000000111da59c5 -[UIViewController _loadViewFromNibNamed:bundle:] + 386
    9   UIKit                               0x0000000111da62e7 -[UIViewController loadView] + 177
    10  UIKit                               0x0000000111da661c -[UIViewController loadViewIfRequired] + 201
    11  UIKit                               0x0000000111da6e70 -[UIViewController view] + 27
    12  UIKit                               0x0000000111c704b5 -[UIWindow addRootViewControllerViewIfPossible] + 71
    13  UIKit                               0x0000000111c70c06 -[UIWindow _setHidden:forced:] + 293
    14  UIKit                               0x0000000111c84519 -[UIWindow makeKeyAndVisible] + 42
    15  UIKit                               0x0000000111bfcf8d -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4818
    16  UIKit                               0x0000000111c030ed -[UIApplication _runWithMainScene:transitionContext:completion:] + 1731
    17  UIKit                               0x0000000111c0026d -[UIApplication workspaceDidEndTransaction:] + 188
    18  FrontBoardServices                  0x00000001164a56cb __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
    19  FrontBoardServices                  0x00000001164a5544 -[FBSSerialQueue _performNext] + 189
    20  FrontBoardServices                  0x00000001164a58cd -[FBSSerialQueue _performNextFromRunLoopSource] + 45
    21  CoreFoundation                      0x0000000111072761 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    22  CoreFoundation                      0x000000011105798c __CFRunLoopDoSources0 + 556
    23  CoreFoundation                      0x0000000111056e76 __CFRunLoopRun + 918
    24  CoreFoundation                      0x0000000111056884 CFRunLoopRunSpecific + 420
    25  UIKit                               0x0000000111bfeaea -[UIApplication _run] + 434
    26  UIKit                               0x0000000111c04c68 UIApplicationMain + 159
    27  fireDataBaseTest                    0x000000010f40409f main + 111
    28  libdyld.dylib                       0x0000000113d8a68d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我是 Swift 和 Firebase 的新手,所以我期待得到一些帮助。修复可能非常简单,我只是因为缺乏技巧而遗漏了一些东西。

最佳答案

您已经找出了错误,但想添加一些内容作为指导。

您的应用委托(delegate)应如下所示(Swift 3、Firebase 3)。还有其他选择。这只是一个起点。

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        FIRApp.configure()
        return true
    }

viewController 应该是

import UIKit
import Firebase

    class ViewController: UIViewController {

        var ref: FIRDatabaseReference!

和你的 viewDidLoad 方法

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    ref = FIRDatabase.database().reference()
}

现在,您的界面功能:

@IBAction func sunnyPressed(_ sender: Any) {
    ref.child("condition").child("addedByUser").setValue("sunny")
}

不确定您是否要这样做,因为它会将以下节点写入 Firebase

rootRef
   condition
     addedByUser: "sunny"

你可能想要这样的东西

rootRef
  conditions
    -Yu99sj9jkoe
       addedByUser: "users uid"
       condition: "snowing"
       timestamp: "20170205075600"
       location: "Mountains"

-Yu99sj9jkoe 是使用 childByAutoId 创建的 - 其余部分是写入该子节点的字典。

哦 - 确保您也导入了从 Firebase 控制台生成的 GoogleService-Info.plist 文件。

编辑:跟进评论。如何获取条件节点中的数据。

有很多方法,但目前,假设我们想要获取特定节点的子数据。这是代码

let conditionsRef = rootRef.child("conditions")
let thisConditionRef = conditionsRef.child("-Yu99sj9jkoe")
thisConditionRef.observeSingleEvent(of: .value, with: { snapshot in
    let conditionDict = snapshot.value as! [String:AnyObject]
    let uid = conditionDict["addedByUser"] as! String
    let location = conditionDict["location"] as! String
    print("uid \(uid) is located in the \(location)"   
})

如果你想把它们都读进去,你会把它改成

allConditionsRef.observeEvent(.value, with: { snapshot in

但是,您随后需要遍历快照并处理每个子项。有很多关于如何做到这一点的帖子。

关于ios - 在简单的应用程序中使用 Firebase 的 Swift - lldb 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42051942/

相关文章:

firebase - 如何在 react-native 中从 Firestore 读取子集合的文档字段

ios - 如何修复 'Video play but don' t have sound on iOS with expo'

ios - 条件绑定(bind)的初始化程序必须具有可选类型,而不是 'DynamicLinks'

swift - 结果数组<>使用 Realm 删除后更改其元素位置

ios - swift2解密MD5

node.js - 从 Netlify 提供的 Web 客户端调用时,Firebase Cloud Function 不会执行

javascript - 中止正在进行的 Firebase 数据库请求

ios - 将文本从 View 中的 TextLabel 传递到另一个 View 中的标签

iOS:两个位置之间的路线距离(路线,不是直线)

ios - 我可以从测试 iPhone 上的应用程序恢复源代码吗 --Swift/Objective C