2017-03-04 83 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