2015-10-14 4 views
0

У меня есть метод, который анализирует JSON для меня, а затем в закрытии загружает и сохраняет изображения на диск. Этот метод вызывается в viewDidLoad. Затем загружает таблицу. Проблема заключается в том, что при загрузке таблицы она содержит только одну ячейку, потому что недостаточно времени для dataTaskWithRequest для загрузки всей информации при загрузке таблицы. Поэтому он загружается с одной ячейкой, а затем, если я нажму кнопку, которая связана с функцией tableView.reloadData(), появится другая ячейка.Заполнять uitableview с dataTaskWithRequest

Как заставить tableView ждать dataTaskWithRequest и отображать его самостоятельно только при завершении извлечения из Интернета?

Вот как метод, который я называю в viewDidLoad выглядит

var JSONStorage : [Article?]? 
var objects = [Article?]() 
var imgPath : String? 

var battlesArticlesListImgPath : String? 
var battleArticlesListHash : String? 
var battleArticlesListArray = [ArticlesList?]() 

@IBOutlet weak var tableView: UITableView! 

@IBAction func button(sender: AnyObject) { 

    print(battleArticlesListArray) 
    print(battleArticlesListHash) 
    dump(battleArticlesListArray) 
    self.tableView.reloadData() 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    downloadBattlesArticlesList() 

func downloadBattlesArticlesList() { 

    let number = arc4random_uniform(1000) 
    let urlString = "http://78.27.190.58:3200/api/category_listing/0/0/?\(number)" 


    if let url = NSURL(string: urlString) { 
     if let data = try? NSData(contentsOfURL: url, options: []) { 
      var json = JSON(data: data) 

      self.battleArticlesListHash = json["content_version"].stringValue 

      let UserDefaults = NSUserDefaults.standardUserDefaults() 
      UserDefaults.setValue(self.battleArticlesListHash, forKey: "battleArticlesListHash") 

      print("preved") 

      for element in json["listing"].arrayValue { 

       let id = Int(element["id"].stringValue) 
       let title = element["title"].stringValue 
       let subtitle = element["subtitle"].stringValue 
       let img = element["image"].stringValue 

       let url = NSURL(string: img) 
       let urlRequest = NSURLRequest(URL: url!) 
       let task = NSURLSession.sharedSession().dataTaskWithRequest(urlRequest, completionHandler: { 

        (data, response, error) -> Void in 

        let image = UIImage(data: data!) 

        var documentsDirectory:String? 

        var paths:[AnyObject] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 

        if paths.count > 0 { 

         documentsDirectory = paths[0] as? String 

         var savePath = documentsDirectory! + "/\(self.randomStringWithLength(5)).jpg" 

         self.battlesArticlesListImgPath = savePath 

         NSFileManager.defaultManager().createFileAtPath(savePath, contents: data, attributes: nil) 

         let obj:ArticlesList = ArticlesList(id: id!, title: title, subtitle: subtitle, image: self.battlesArticlesListImgPath!) 

         self.battleArticlesListArray.append(obj) 

        } 
       }) 

      task.resume() 

      } 

     } 
    } 

    print(battleArticlesListArray) 
} 

Final печать также показывает пустой массив при выполнении.

+0

Проверьте мой ответ здесь http://stackoverflow.com/questions/31279369/capturing-closure-values-in- swift/31279784 # 31279784 это может помочь вам –

ответ

0

В вашем viewDidLoad, скрыть Tableview:

tableView.hidden = true 

Просто позвоните tableView.reloadData() после того, как здесь

 if paths.count > 0 { 

          documentsDirectory = paths[0] as? String 

          var savePath = documentsDirectory! + "/\(self.randomStringWithLength(5)).jpg" 

          self.battlesArticlesListImgPath = savePath 

          NSFileManager.defaultManager().createFileAtPath(savePath, contents: data, attributes: nil) 

          let obj:ArticlesList = ArticlesList(id: id!, title: title, subtitle: subtitle, image: self.battlesArticlesListImgPath!) 

          self.battleArticlesListArray.append(obj) 

         } 
tableView.hidden = false 
tableView.reloadData() 

Это потому, что ваша задача кладется на фоне протектора. После того, как будет возвращено какое-то значение, и все ваши задачи будут выполнены, просто обновите представление таблицы.

Причина, по которой вы печатаете печатное значение пустого значения, состоит в том, что она выполняется, прежде чем данные будут возвращены.

Кроме того, это не плохая идея, чтобы посмотреть документацию на резьб под прошивкой: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html

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