2016-04-14 16 views
0

簡単なFirebaseアプリケーションを作成しようとしていますが、これまでAndroidで行っています。私は素早く勉強しており、Firebaseが提供する基本的なチュートリアルに従っていました。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データベース:

enter image description here

+0

になります文字列を辞書として扱っています。エラーの原因となっているコードはどれですか? – rmaddy

+0

どの行を決定するのですか?私は迅速なプログラミングには新しいです。 – tccpg288

+0

クラッシュをデバッグする方法については、http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1を参照してください。 – rmaddy

答えて

2

.Valueで観察すると、ノードの内容全体が読み取られます。あなたの構造は、この

myRootRef 
    iso-weather-practice: "sunny" 

のようなものである場合

だからあなたのイベントは大丈夫だろうと、それはこの

self.mLabel.text = baseResult as? String 

のように読み取ることができるしかし、それはFirebase構造がどのように見えるか、通常ではありません。これ以上のようになります

myRootRef 
    -JYa6s6gij900is 
     date: "20160413" 
     weather: "sunny" 
    -JY9398iias98o4 
     date: "20160414" 
     weather: "blowing snow" 

この場合、 .VALUEは、そのノード全体に読まれ、スナップショットは(キーとして:値のペア)複数のノードが含まれていますので、ここで

をそれを処理する方法は次のとおりです。

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 
+0

"?"アイテムがnullである可能性があることを示しますか?言い換えれば、これはオプションのバインディングの例ですか? – tccpg288

+0

@ tccpg288はい!子どもが何も持っていなければ、コードは静かに動かずに動かすという点であなたのコードを守るように設計されています。まだ行っていない場合は、Swift Optionalを検索し、Appleが投稿したチュートリアルをチェックしてください。それは良い読書です。 – Jay

+0

Firebase DBに複数のクラスタ(c1、c2、c3など)があり、その特定のクラスタ内のすべてのノード/オブジェクトを最初に表示したいとします。私は self.ref.child( "c1")。observe(.Value ... と私はそれらのすべてを取得します。私はどのc1のオブジェクトの変更を観察する別の方法を設定しました self.ref.child( "c1")。observe(.childChanged、 )変更が検出されると、これらのメソッドの両方が呼び出されるたびに問題が発生します。最初に変更されたノードを取得し、次にクラスタ全体を再度取得します。ここでは? –

2

てみてくださいthis:

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

なぜ私のコードの.objectForKey部分を削除しましたか?それは実際に働く、私は助けに感謝します。しかし、あなたがしたことを正確には分かりません。私はもはやios-weather-practiceキー – tccpg288

+0

@ tccpg288をあなたのデータから参照していません。あなたのref変数がルートノードに直接向いているように見えますが、ios-weather-practiceキーのもとでfirebase GUIで表されたオブジェクトですあなたのfirebaseアプリの名前。そのオブジェクトの値を呼び出すと、そのキーの下の値が返されます。 – pkacprzak

+0

この回答は、ノードに追加の子値が含まれていて、辞書から文字列の割り当てエラーでクラッシュすると正しく動作しないため、より詳しい説明が必要です。 – Jay

関連する問題