我正在关注官方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的新手,所以我期待得到一些帮助。修复可能非常简单,因为缺乏技能,我只是缺少一些东西。
答案 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)"
})
但是,您需要迭代快照并解决每个孩子的问题。关于如何做到这一点有很多帖子。