2016-03-09 2 views
0

хорошо я выборки данных из Интернета и эти данные аналогичны медленнеезагрузки данных после dispatch_get_global_queue конца

так что я должен загрузить его в dispatch_get_global_queue но viewDidLoad

, но главная проблема, что если есть CollectionView или таблица будет загружаться, пока данные выборки из интернета, а затем вид коллекции для секции дают мне ноль, как это можно сделать нагрузку вид коллекции после dispatch_get_global_queue закончить

import UIKit 


class SectionViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource { 
    @IBOutlet weak var sectionTab: UIImageView! 
    @IBOutlet weak var sectionTitle: UILabel! 
    var sectionsPosts:JSON! 
    @IBOutlet weak var collectionView: UICollectionView! 
    var sectionsTap:JSON! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
        dispatch_async(dispatch_get_global_queue(priority, 0)) { 

     if Reachability.isConnectedToNetwork() == true { 
       if let url = NSURL(string: "http://nepraswebsite.com/new_lille/mobile_api/blog/first_tab/1") { 
        if let data = try? NSData(contentsOfURL: url, options: []) { 
         self.sectionsTap = JSON(data: data) 
        } 
       } 

       if let newurl = NSURL(string: "http://nepraswebsite.com/new_lille/mobile_api/blog/posts_by_category/" + sections[tapIndex]["Slug"].stringValue + "/1") { 
        if let newdata = try? NSData(contentsOfURL: newurl, options: []) { 
         self.sectionsPosts = JSON(data: newdata) 
        } 
       } 
       self.collectionView.reloadData() 

     } 

    } 
    } 
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

     return sectionsPosts.count 

    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

     let cellA = collectionView.dequeueReusableCellWithReuseIdentifier("postsCell", forIndexPath: indexPath) as! PostsCollectionViewCell 


      cellA.postImage.sd_setImageWithURL(NSURL(string: sectionsPosts[indexPath.row]["Image"].stringValue 
       ), placeholderImage: UIImage(named: "demopic")) 
      cellA.postTitle.text = sectionsPosts[indexPath.row]["Title"].stringValue 
      return cellA 

    } 

     func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

      UIApplication.sharedApplication().openURL(NSURL(string: sectionsPosts[indexPath.row]["URL"].stringValue 
)!) 


    } 

} 

ответ

0

Ваш numberOfItemsInSection должен знать, что фоновая задача еще не завершена. Один из способов сделать это:

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return sectionPosts?.count ?? 0 
    // or 
    return sectionsPosts == nil ? 0 : sectionsPosts.count 
} 

Когда нагрузка будет завершена, вы установите эту переменную и вызвать reloadData для отображения.

Однако есть еще несколько проблем. Во-первых, reloadData должен быть вызван в основную очередь, вдоль линий:

dispatch_async(dispatch_get_main_queue(), { 
    self.collectionView.reloadData() 
}) 

Во-вторых, Apple рекомендует использовать dataTaskWithURL:completionHandler: (на NSURLSession) вместо contentsOfURL:. Это запустит задачу в фоновом потоке для вас и предоставит обработчик завершения для вашего кода ответа. Вы можете найти эту рекомендацию в разделе dataWithContentsOfURL:options:error: в документации NSData here.

+0

'return sectionPosts? .count ?? 0' – nhgrif

+0

@nhgrif да, я слышу вас. Старые привычки умирают с трудом. – Michael

+0

ty^_ ^, он работает как шарм: $ –

Смежные вопросы