2016-04-09 154 views
-1

我試圖從後端獲取一些數據,然後將其分配給3個不同的數組。這些數組然後我想用來填充我的tableViewCells。問題是,當我在取塊的外面打印數組時,它們返回nil。當我在獲取塊中打印它們時,它們會返回我打算這樣做的對象的變量。如何填充這些數組以填充tableView?

我包含self.tableView.reloadData()行,希望數組被填充,然後填充tableViewCells,但它似乎並沒有工作。

歡迎任何有關如何正確填充這些數組的提示,以便在獲取請求之外打印它們時,它們會返回相應的數據。

var capArray = [String]() 
var imageDic = [String: [PFFile]]() 
var priceArray = [Int]() 


override func viewDidAppear(animated: Bool) { 

    capArray.removeAll(keepCapacity: true) 
    imageDic.removeAll(keepCapacity: true) 
    priceArray.removeAll(keepCapacity: true) 

    let query = PFQuery(className: "SellerObject") 
    query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 

     if let objects = objects { 
      for o in objects { 

       if o.objectForKey("caption") != nil && o.objectForKey("imageFile") != nil && o.objectForKey("price") != nil { 
       let cap = o.objectForKey("caption") as? String 
        self.capArray.append(cap!) 
       let imdic = o.objectForKey("imageFile") as? [PFFile] 
       self.imageDic[cap!] = imdic 
       let price = o.objectForKey("price") as? String 
       let priceInt = Int(price!) 
       self.priceArray.append(priceInt!) 

      } 
      } 
     } 
    } 

    self.tableView.reloadData()  
} 

回答

0

你的問題是self.tableView.reloadData()在塊完成執行之前執行。

看到它工作的最簡單的方法是在塊內部移動self.tableView.reloadData(),但這僅僅是一個短期的黑客行爲而已。

但這不是正確的長期方法。要正確地做到這一點,你的陣列人口代碼應該真的在模型中。 您的表視圖會在最初加載時沒有要使用的數據,您的模型會在數據可用時通知您的視圖控制器,然後視圖控制器將更新該表。

如果數據來自設備,表格視圖可能會在加載之前等待數據可以快速檢索,如果數據通過網絡傳送,則需要等待。

+0

好的,這是有道理的。但現在,當我添加self.tableView.reloadData()應用程序崩潰時出現以下錯誤消息:致命錯誤:意外地發現零,同時解包可選值 –

+0

您需要找出來自哪裏。在標題或問題中,字面意思是成千上萬的問題與「意外地發現零,同時解開可選值」。 – Gruntcakes

+1

檢查這個線程:http://stackoverflow.com/questions/35683813/how-to-deal-with-fatal-error-unexpectedly-found-nil-while-unwrapping-an-option –