2016-09-11 5 views
0

私はtabBarコントローラを使用しています。 TabOneはrootVCです。 TabOneには、SendButton経由でFirebaseに情報を送信し、プログラムでTabTwoを表示するviewControllerがあります。Firebaseのdispatch_asyncはクラッシュし続けます。-swift 2 iOS9

In TabTwoには、情報を取得して表示するtableViewコントローラがあります。奇妙なことに私はコードを実行し、すべてがうまくいきました。私はsendButtonを押しました.TabTwoが表示され、正しく表示され、正しい情報でセルが読み込まれます。この問題は今では2回成功したばかりの奇妙な理由があり、それ以来dispatch_asyncでクラッシュしています。

今、シミュレータを実行しようとしましたが、TabOneでsendButtonを押すのではなく、TabTwoのタブを押して、dispatch_asyncでアプリケーションがクラッシュしました。私はちょうどTabTwoのタブをクリックし、dispatch_asyncはコードでクラッシュし、Firebaseには何も送信しようとしませんでした:

Thread1: EXC_BAD_INSTRUCTION (code=EXC_1338_INVOP, subcode=0x0) 

私がタブを切り替える際にクラッシュするようだなぜすべてのアイデア? なぜすべてがうまく2回走った後、突然クラッシュしたのか?ここで

はコードです:

ModelObject

class CookieModel: NSObject{ 
    var name: String? 
} 

tab1の

class TabOneController: UIViewController{ 

var dbRef: FIRDatabaseReference! 
let userID: String? = (FIRAuth.auth()?.currentUser?.uid)! 
let cookieModel = [CookieModel]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.dbRef = FIRDatabase.database().reference() 
} 

@IBAction func sendButton(sender: UIButton){ 
    self.sendToFireBase() 

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let tabBarController = mainStoryboard.instantiateInitialViewController() as! UITabBarController 
    tabBarController.selectedIndex = 1 
    self.presentViewController(tabBarController , animated: true, completion: nil) 
} 

//Code to send data to FirebaseDatabase 
func sendToFireBase(){ 

    let uniquePath = NSUUID().UUIDString 
    let usersIDRef = self.dbRef.child("users").child(self.userID!) 
    let cookiePath = usersIDRef.child("cookieData").child(self.uniquePath) 

    let cookie0 = CookieModel() 
    cookie0.name = "oatmeal" 
    self.cookieModel.append(cookie0) 

    let cookie1 = CookieModel() 
    cookie1.name = "chocolate" 
    self.cookieModel.append(cookie1) 

    let cookie2 = CookieModel() 
    cookie2.name = "coconut" 
    self.cookieModel.append(cookie2) 

    var cookieDict = [String:AnyObject]() 
    cookieDict.updateValue(cookie0.name!, forKey: "cookie0") 
    cookieDict.updateValue(cookie1.name!, forKey: "cookie1") 
    cookieDict.updateValue(cookie2.name!, forKey: "cookie2") 

    cookiePath.updateChildValues(cookieDict, withCompletionBlock: { 
       (error, user) in 

      if error != nil{ 
       print((error?.localizedDescription)) 
       return 
      } 
     } 

} 

TAB2

class TabTwoController: UIViewController, UITableViewDataSource, UITableViewDelegate{ 

@IBOutlet weak var tableView: UITableView! 

var dbRef: FIRDatabaseReference! 
let userID: String? = (FIRAuth.auth()?.currentUser?.uid)! 
var cookieModel = [CookieModel]() 

override func viewDidLoad() { 
     super.viewDidLoad() 

    self.dbRef = FIRDatabase.database().reference() 
    self.tableView.delegate = self 

    self.observeFBCookieData() 
} 

//Code to retrieve data from FirebaseDatabase 
func observeFBCookieData(){ 

    let usersIDRef = self.dbRef.child("users").child(self.userID!) 
    let cookiePath = usersIDRef.child("cookieData") 

    cookiePath.observeEventType(.ChildAdded, withBlock: { 

     (snapshot) in 

     if let dict = snapshot.value as? [String:AnyObject]{ 

     let cookie0 = dict["cookie0"] as? String 
     let cookie1 = dict["cookie1"] as? String 
     let cookie2 = dict["cookie2"] as? String 

     let cookie0 = CookieModel() 
     cookie0.name = cookie0! 
     self.cookieModel.append(cookie0) 

     let cookie1 = CookieModel() 
     cookie1.name = cookie1! 
     self.cookieModel.append(cookie1) 

     let cookie2 = CookieModel() 
     cookie2.name = cookie2! 
     self.cookieModel.append(cookie2) 

     dispatch_async(dispatch_get_main_queue(), { 
        self.tableView.reloadData() 
       }) 
    } 
    }, withCancelBlock: nil) 
} 

//MARK: -TableViewDatasource Methods 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.cookieModel.count 
} 



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyCookieCell 

     cell.titleLabel.text = self.cookieModel[IndexPath.row].name! 

     return cell 

    } 

} 
+0

完全なエラーは何ですか?どのラインで正確にエラーが発生しますか? – rmaddy

+0

@rmaddyこんにちは、ありがとう。これはエラー行です:dispatch_async(dispatch_get_main_queue()、{ –

+0

これはエラーです:Thread1:EXC_BAD_INSTRUCTION(code = EXC_1338_INVOP、subcode = 0x0) –

答えて

0

はAFTEあなたのviewDidLoadでテーブルビューのデータソースを設定してみてくださいrその代理人を設定する。

Self.tableView.datasource = self 
関連する問題