Это приложение модифицирует механизм автомакета из фонового потока — ios9

let url = NSURL(string: "http://api.mdec.club:3500/news?")

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {
    (data, response, error) in

    self.jsonResult = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableArray

    self.tableView.reloadData()
}

task.resume()

Я не понимаю, почему я получаю эту ошибку. Я должен поместить метод reloadData() внутрь task, потому что мне нужно дождаться получения данных. Как еще я могу перезагрузить представление таблицы, не получая этой ошибки?


person Schuey999    schedule 15.11.2015    source источник


Ответы (1)


Как еще я могу перезагрузить представление таблицы, не получая этой ошибки?

Вы выходите в основной поток, чтобы вызвать reloadData, например:

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {
    (data, response, error) in
    self.jsonResult = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableArray
    dispatch_async(dispatch_get_main_queue()) {
        self.tableView.reloadData()
    }
}

Всегда делайте это каждый раз, когда касаетесь интерфейса из кода, который был вызван в фоновом потоке. Никогда, никогда, никогда, никогда, никогда не касайтесь интерфейса, кроме как в основном потоке.

person matt    schedule 15.11.2015
comment
На самом деле не очень разумно изменять self.jsonResult в фоновом потоке, поэтому вы можете поместить обе строки в вызов dispatch_async. - person matt; 15.11.2015
comment
это работает спасибо! Примем ответ через 4 минуты. ;) - person Schuey999; 15.11.2015
comment
Мэтт, можешь ли ты объяснить, почему, просто чтобы я знал, почему я делаю то, что делаю, если я добавляю jsonResult в отправку? - person Schuey999; 15.11.2015
comment
Правильным было бы выполнить десериализацию в фоновом режиме, а затем присвоить self.jsonResult в основной очереди непосредственно перед перезагрузкой. - person nhgrif; 15.11.2015
comment
@nhgrif очень хороший момент, я не дразнил его достаточно далеко друг от друга - person matt; 15.11.2015
comment
@nhgrif, но почему? (просто хочу знать) - person Schuey999; 16.11.2015
comment
@Schuey999Schuey999 О какой части вы спрашиваете, почему? - person nhgrif; 16.11.2015
comment
@nhgrif, почему jsonResult не должен быть в фоновом потоке - person Schuey999; 16.11.2015
comment
Потому что, по-видимому, вы используете jsonResult в качестве данных для своей таблицы. Если вы измените его в фоновом режиме, вы можете получить что-то вроде индекса за пределами границ, если, скажем, ваша таблица изначально загружала 10 строк, но вы только что перезаписали jsonResult чем-то, что будет иметь только 3 строки. - person nhgrif; 16.11.2015