У меня есть метод, который анализирует 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 печать также показывает пустой массив при выполнении.
Проверьте мой ответ здесь http://stackoverflow.com/questions/31279369/capturing-closure-values-in- swift/31279784 # 31279784 это может помочь вам –