2017-03-04 77 views
0

我想使用Swift開發IOS應用程序。該應用程序是一個簡單的應用程序,從數據庫和顯示檢索數據。CollectionUIView刷新數據後不更新顯示

問題是我無法管理顯示通過REST服務器從數據庫檢索的數據...我已經問了類似的問題here

正如我在那裏指出的那樣,我試着DispatchQueue.main.async來執行fetching和reloadData()。但失敗了。

當我將異步替換爲同步時,它會部分工作(第一次加載屏幕時,它不顯示,但之後顯示項目)。

你們能幫我解決嗎?

以下是我的類代碼

import UIKit 

class OrderViewController:UIViewController { 

    let cartView:UIView = { 
     let tableView = UIView() 
     tableView.backgroundColor = UIColor.gray 
     tableView.translatesAutoresizingMaskIntoConstraints = false 
     return tableView 
    }() 

    var itemView:UIView = UIView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     edgesForExtendedLayout = [] 
     view.backgroundColor = UIColor.white 
     itemView.translatesAutoresizingMaskIntoConstraints = false 
     view.addSubview(itemView) 
     view.addSubview(cartView) 
     setupItemView() 
     setupCartView() 
     let layout = UICollectionViewFlowLayout() 
     layout.sectionInset = UIEdgeInsets(top: 20, left: 20, bottom: 10, right: 20) 
     //let viewFrame = CGRect(x: view.bounds.minX, y: view.bounds.minY, width: view.bounds.width*2/3, height: view.bounds.height) 
     let collectionViewController = ItemcollectionViewController(collectionViewLayout: layout) 

     // get rid of black bar underneath navBar 
     self.navigationController?.navigationBar.shadowImage = UIImage() 
     self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) 

     itemView.addSubview(collectionViewController.view) 
    } 

    private func setupItemView(){ 
     itemView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
     itemView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
     itemView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 2/3).isActive = true 
     itemView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true 
    } 

    private func setupCartView() { 
     cartView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
     cartView.leftAnchor.constraint(equalTo: itemView.rightAnchor).isActive = true 
     cartView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1/3).isActive = true 
     cartView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true 
    } 
} 

類其中獲取數據:

import UIKit 
import Alamofire 
import SwiftyJSON 

class ItemcollectionViewController:UICollectionViewController, UICollectionViewDelegateFlowLayout { 

    let dateFormat = "yyyy-MM-dd" 
    let cellId = "CellId" 
    //var categories: [Category]? 
    var categories = [Category]() 
    let viewOptionVar:ViewOptionBar = { 
     let vOV = ViewOptionBar() 
     vOV.translatesAutoresizingMaskIntoConstraints = false 
     return vOV 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     collectionView?.backgroundColor = UIColor.white 
     collectionView?.register(ItemCell.self, forCellWithReuseIdentifier: cellId) 
     collectionView?.contentInset = UIEdgeInsetsMake(50, 0, self.view.frame.height, self.view.frame.width) 
     collectionView?.scrollIndicatorInsets = UIEdgeInsetsMake(50, 0, 0, self.view.frame.width) 
     collectionView?.dataSource = self 
     collectionView?.delegate = self 
     DispatchQueue.global().async { 
      Alamofire.request("http://localhost:8080/category/all").responseJSON { (responseData) -> Void in 
       switch responseData.result{ 
       case .success: 
        if let returnedCategories = responseData.result.value as! NSArray? { 
         for element in returnedCategories { 
          let categoryDictionary = element as! NSDictionary 
          let category = Category() 
          category.categoryId = categoryDictionary["categoryId"] as? String 
          category.categoryName = categoryDictionary["categoryName"] as? String 
          category.categoryDescription = categoryDictionary["categoryDescription"] as? String 
          let categoryRegisteredDateString = categoryDictionary["categoryRegisteredDate"] as? String 
          let df = DateFormatter() 
          df.dateFormat = self.dateFormat 
          let categoryRegisteredDate = df.date(from: categoryRegisteredDateString!)! 
          category.categoryRegisteredDate = categoryRegisteredDate 
          self.categories.append(category) 
         } 
         print("After parsing \(self.categories)") 
        } 
       case .failure(let error): 
        print("Error while fetching Categories: \(error)") 
       } 
      } 
      DispatchQueue.main.async { 
       self.collectionView?.reloadData() 
      } 
     } 
     print(self.categories) 
    } 

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return self.categories.count 
    } 

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! ItemCell 
     cell.category = categories[indexPath.item] 
     return cell 
    } 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     return CGSize(width: 111, height: 111) 
    } 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
     return 0 
    } 

    private func setupViweOptionBar() { 
     view.addSubview(viewOptionVar) 
     view.addConstraintsWithFormat(format: "H:|[v0]|", views: viewOptionVar) 
     view.addConstraintsWithFormat(format: "V:|[v0(50)]", views: viewOptionVar) 
    } 
} 

回答

0

試試這個。

var categories = [Category](){ 
    didSet { 
     self.collectionView?.reloadData() 
    } 
} 

擺脫

DispatchQueue.main.async { 
      self.collectionView?.reloadData() 
} 
+0

屏幕仍是空白:( –

0

您:

DispatchQueue.main.async { 
       self.collectionView?.reloadData() 
      } 

好像是Alamofire要求之外。移動它內部case .success:

+0

就嘗試過,但沒有奏效 –

+0

@ J.GS.Han我jujst你的代碼看了一遍,我迅速不代碼,但要添加UICollectionViewController內UIViewController。不知道爲什麼你這樣做,你甚至沒有正確地添加它,你需要添加它作爲childViewController http://stackoverflow.com/questions/26599858/how-to-properly-add-child -view-controller-in-ios-8-with-swift然而,在用Alamofire的響應試驗collectionView之前,先試試一下模擬單元,看看它是否顯示出來,如果我寫的沒有解決問題,如果沒有調試,很難看到問題出在哪裏 – 2017-03-05 09:42:45