2016-04-14 1 views
0

Я пытаюсь создать простое приложение Firebase, и ранее я делал это на Android. Я быстро обучаюсь и следую основным учебным пособиям Firebase.Не могу прочитать данные Firebase с помощью Swift

Я успешно добавил Firebase через CocoaPods, однако у меня возникли проблемы с чтением результат:

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

У меня есть несколько кластеров (c1, c2, c3 и т. Д.) В моей Firebase DB и позволяет сказать, что я хочу сначала отобразить все узлы/объекты в этом конкретном кластере. Я делаю self.ref.child («c1»). Наблюдайте (.Value ... , и я все получаю. Я установил другой способ наблюдения за любым изменением любого объекта c1, для которого я делаю self.ref.child ("c1"). наблюдать (.childChanged, теперь проблема возникает, когда обнаружено изменение, оба этих метода вызывают. Сначала я получаю измененный узел, а затем весь кластер. Любая помощь здесь? –

2

Try это:

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

Почему вы удалили часть .objectForKey моего кода? Это действительно работает, я ценю помощь. Однако точно не знаю, что вы сделали. Я больше не ссылаюсь на ключ iOS-weather-practice – tccpg288

+0

@ tccpg288 из ваших данных, который выглядит так, что ваша переменная ref указывает прямо на корневой узел с объектом, представленным в графическом интерфейсе firebase под ключом ios-weather-practice, что, вероятно, является имя вашего приложения firebase. Вызывающее значение для этого объекта возвращает значение под этим ключом. – pkacprzak

+0

Этот ответ нуждается в дополнительном пояснении, так как он не будет работать должным образом, если узел содержит дополнительные дочерние значения и сработает с ошибкой присваивания словаря. – Jay