在简单的app中使用Firebase Swift - lldb错误

时间:2017-02-05 12:16:52

标签: 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的新手,所以我期待得到一些帮助。修复可能非常简单,因为缺乏技能,我只是缺少一些东西。

1 个答案:

答案 0 :(得分:2)

您已经发现了错误,但想要添加一些内容以供指导。

您的应用代表应如下所示(Swift 3,Firebase 3)。还有其他选择。这只是一个起点。

<artifactId>schema</artifactId>

    <properties>
        <xsd.build.dir>${basedir}/src/main/resources</xsd.build.dir>
        <generated.source.location>${basedir}/target/generated-sources/src</generated.source.location>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics</artifactId>
            <version>0.6.4</version>
        </dependency>
        <dependency>
            <groupId>B</groupId>
            <artifactId>View</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
       <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.12</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.12</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <generateDirectory>${generated.source.location}</generateDirectory>
                    <schemaDirectory>${xsd.build.dir}</schemaDirectory>
                    <addIfExistsToEpisodeSchemaBindings>true</addIfExistsToEpisodeSchemaBindings>
                    <extension>true</extension>
                    <plugins>
                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-basics-annotate</artifactId>
                             <version>1.0.2</version>
                        </plugin>
                    </plugins>
                    <args>
                        <arg>-Xannotate</arg>
                    </args>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

viewController应该是

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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

和你的viewDidLoad方法

import UIKit
import Firebase

    class ViewController: UIViewController {

        var ref: FIRDatabaseReference!

现在,您的界面功能:

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

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

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

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

你可能需要像

这样的东西
rootRef
   condition
     addedByUser: "sunny"

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

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

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

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

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

如果您想要阅读所有内容,请将其更改为

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)"   
})

但是,您需要迭代快照并解决每个孩子的问题。关于如何做到这一点有很多帖子。