Ios Can';t使用Swift读取Firebase数据

Ios Can';t使用Swift读取Firebase数据,ios,swift,firebase,unrecognized-selector,Ios,Swift,Firebase,Unrecognized Selector,我正在尝试创建一个简单的Firebase应用程序,我以前在Android上也这样做过。我正在学习swift,并遵循Firebase提供的基本教程 我已通过CocoaPods成功添加了Firebase,但在阅读结果时遇到了问题: import UIKit import Firebase class ViewController: UIViewController { @IBOutlet var mLabel: UILabel! var myRootRef = Firebase(url:"ht

我正在尝试创建一个简单的Firebase应用程序,我以前在Android上也这样做过。我正在学习swift,并遵循Firebase提供的基本教程

我已通过CocoaPods成功添加了Firebase,但在阅读结果时遇到了问题:

import UIKit
import Firebase

class ViewController: UIViewController {

@IBOutlet var mLabel: UILabel!

var myRootRef = Firebase(url:"https://ios-weather-practice.firebaseio.com")


override func viewDidLoad() {
    super.viewDidLoad()

    myRootRef.observeEventType(.Value, withBlock: {
        snapshot in
        if let baseResult = snapshot.value.objectForKey("ios-weather-practice") {
            self.mLabel.text = baseResult as? String
        }
    })
}

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


}
错误:

    2016-04-14 16:37:06.424 Firebase Sample[1833:1735025] -           [NSTaggedPointerString objectForKey:]: unrecognized selector sent to instance 0xa000000747365744
2016-04-14 16:37:06.432 Firebase Sample[1833:1735025] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString objectForKey:]: unrecognized selector sent to instance 0xa000000747365744'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001066f5f45 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000108419deb objc_exception_throw + 48
    2   CoreFoundation                      0x00000001066fe56d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010664beea ___forwarding___ + 970
    4   CoreFoundation                      0x000000010664ba98 _CF_forwarding_prep_0 + 120
    5   Firebase Sample                     0x0000000106367759 _TFFC15Firebase_Sample14ViewController11viewDidLoadFS0_FT_T_U_FGSQCSo13FDataSnapshot_T_ + 329
    6   Firebase Sample                     0x00000001063679f7 _TTRXFo_oGSQCSo13FDataSnapshot__dT__XFo_iGSQS___iT__ + 23
    7   Firebase Sample                     0x0000000106366d81 _TPA__TTRXFo_oGSQCSo13FDataSnapshot__dT__XFo_iGSQS___iT__ + 81
    8   Firebase Sample                     0x0000000106367a30 _TTRXFo_iGSQCSo13FDataSnapshot__iT__XFo_oGSQS___dT__ + 32
    9   Firebase Sample                     0x0000000106367a78 _TTRXFo_oGSQCSo13FDataSnapshot__dT__XFdCb_dGSQS___dT__ + 56
    10  Firebase                            0x00000001064316e1 __43-[FValueEventRegistration fireEvent:queue:]_block_invoke53 + 78
    11  libdispatch.dylib                   0x000000010980ae5d _dispatch_call_block_and_release + 12
    12  libdispatch.dylib                   0x000000010982b49b _dispatch_client_callout + 8
    13  libdispatch.dylib                   0x00000001098132af _dispatch_main_queue_callback_4CF + 1738
    14  CoreFoundation                      0x00000001066562e9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    15  CoreFoundation                      0x00000001066178a9 __CFRunLoopRun + 2073
    16  CoreFoundation                      0x0000000106616e08 CFRunLoopRunSpecific + 488
    17  GraphicsServices                    0x000000010ace9ad2 GSEventRunModal + 161
    18  UIKit                               0x0000000106f1230d UIApplicationMain + 171
    19  Firebase Sample                     0x000000010636840d main + 109
    20  libdyld.dylib                       0x000000010985f92d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 
Firebase数据库:

试试这个:

if let baseResult = snapshot.value as? String {
    self.mLabel.text = baseResult
}
试试这个:

if let baseResult = snapshot.value as? String {
    self.mLabel.text = baseResult
}

值将读取节点的全部内容

如果你的结构是这样的

myRootRef
   iso-weather-practice: "sunny"
self.mLabel.text = baseResult as? String
myRootRef
   -JYa6s6gij900is
      date: "20160413"
      weather: "sunny"
   -JY9398iias98o4
      date: "20160414"
      weather: "blowing snow"
你的活动将是好的,它可以这样读

myRootRef
   iso-weather-practice: "sunny"
self.mLabel.text = baseResult as? String
myRootRef
   -JYa6s6gij900is
      date: "20160413"
      weather: "sunny"
   -JY9398iias98o4
      date: "20160414"
      weather: "blowing snow"
然而,Firebase结构通常不是这样出现的。更像这样

myRootRef
   iso-weather-practice: "sunny"
self.mLabel.text = baseResult as? String
myRootRef
   -JYa6s6gij900is
      date: "20160413"
      weather: "sunny"
   -JY9398iias98o4
      date: "20160414"
      weather: "blowing snow"
那样的话。值将在整个节点中读取,快照将包含多个节点(作为键:值对)

下面是如何处理的:

ref.observeEventType(.Value, withBlock: { snapshot in

    for child in snapshot.children {
        if let w = child.value.objectForKey("weather") as? String {
          print(w)
        }
    }

})
输出将是

sunny
blowing snow

值将读取节点的全部内容

如果你的结构是这样的

myRootRef
   iso-weather-practice: "sunny"
self.mLabel.text = baseResult as? String
myRootRef
   -JYa6s6gij900is
      date: "20160413"
      weather: "sunny"
   -JY9398iias98o4
      date: "20160414"
      weather: "blowing snow"
你的活动将是好的,它可以这样读

myRootRef
   iso-weather-practice: "sunny"
self.mLabel.text = baseResult as? String
myRootRef
   -JYa6s6gij900is
      date: "20160413"
      weather: "sunny"
   -JY9398iias98o4
      date: "20160414"
      weather: "blowing snow"
然而,Firebase结构通常不是这样出现的。更像这样

myRootRef
   iso-weather-practice: "sunny"
self.mLabel.text = baseResult as? String
myRootRef
   -JYa6s6gij900is
      date: "20160413"
      weather: "sunny"
   -JY9398iias98o4
      date: "20160414"
      weather: "blowing snow"
那样的话。值将在整个节点中读取,快照将包含多个节点(作为键:值对)

下面是如何处理的:

ref.observeEventType(.Value, withBlock: { snapshot in

    for child in snapshot.children {
        if let w = child.value.objectForKey("weather") as? String {
          print(w)
        }
    }

})
输出将是

sunny
blowing snow


您将字符串视为字典。到底是哪一行代码导致了错误?如何确定哪一行?我是swift编程新手。请参阅以了解如何调试崩溃。您将字符串视为字典。到底是哪一行代码导致了错误?如何确定哪一行?我是swift编程新手。请参阅以了解如何调试崩溃。为什么删除我代码中的.objectForKey部分?它确实有效,我感谢你的帮助。但我不确定你到底做了什么。我不再是ios天气练习的参考者key@tccpg288从您的数据来看,ref变量直接指向根节点,它是firebase GUI中ios weather practice键下表示的对象,可能是firebase应用程序的名称。调用该对象上的值将返回该键下的值。此答案需要进一步解释,因为如果节点包含其他子值,它将无法正常工作,并且会因字典到字符串赋值错误而崩溃。@Jay代码不应是防御性的。由于数据是以这种方式构造的,因此代码工作得非常好。我总是讨厌防御性编程。特别是在一个辅导案例中,这就是我们这里的案例。哦,我同意。然而,OP没有发布结构,所以我不想假设它是什么。另外,突出显示一个更具“全局性”的Firebase示例(利用autoId、适当的结构、迭代快照等)。从长远来看可能会有更多帮助。对于单个键,您的答案是非常正确的:值对情况和对可选项的说明是完美的。为什么要删除代码中的.objectForKey部分?它确实有效,我感谢你的帮助。但我不确定你到底做了什么。我不再是ios天气练习的参考者key@tccpg288从您的数据来看,ref变量直接指向根节点,它是firebase GUI中ios weather practice键下表示的对象,可能是firebase应用程序的名称。调用该对象上的值将返回该键下的值。此答案需要进一步解释,因为如果节点包含其他子值,它将无法正常工作,并且会因字典到字符串赋值错误而崩溃。@Jay代码不应是防御性的。由于数据是以这种方式构造的,因此代码工作得非常好。我总是讨厌防御性编程。特别是在一个辅导案例中,这就是我们这里的案例。哦,我同意。然而,OP没有发布结构,所以我不想假设它是什么。另外,突出显示一个更具“全局性”的Firebase示例(利用autoId、适当的结构、迭代快照等)。从长远来看可能会有更多帮助。对于单个键,您的答案非常正确:值对情况和可选项的说明是完美的。“”是否表示该项可能为空?换句话说,这是可选绑定的示例吗?@tccpg288是!它的设计目的是保护您的代码,因为如果子级不包含任何内容,代码将以静默方式继续运行,而不会崩溃。如果您还没有这样做,请搜索Swift Optional并查看Apple发布的教程。这本书读得很好。我在Firebase数据库中有多个集群(c1、c2、c3等),假设我想首先显示该特定集群中的所有节点/对象。我做self.ref.child(“c1”).observe(.Value…,我得到了所有的值。我设置了另一个方法来观察c1中任何对象的任何变化,我做self.ref.child(“c1”).observe(.childChanged,现在的问题是每当检测到更改时,都会调用这两种方法。我首先获取更改的节点,然后再次获取整个群集。这里有帮助吗?@YashTamakuwala我们很乐意提供帮助!请创建一个新问题,概述该问题,并包括您的代码和Firebase结构(请以文本形式,无图像)我们来看看!@Jay.firebase回调是由主线程上的客户端调用的,还是我应该使用
ref.observeEventType(.Value,withBlock:{DispatchQueue.main.async中的快照{//更新主线程上的用户界面}})
?是否表示该项可能为空?换句话说,这是可选绑定的示例吗?@tccpg288是的!它旨在保护您的代码,因为如果子项不包含任何内容,代码将自动移动而不会崩溃。如果您没有这样做,请搜索Swift optional并查看Apple发布的教程。这是一个读得好。我在Firebase DB中有多个集群(c1、c2、c3等),假设我想首先显示该特定集群中的所有节点/对象。我做self.ref