2014-02-10 3 views
2
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask 
*)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite 
{ 
    float progress = (float)((float)totalBytesWritten /(float)totalBytesExpectedToWrite); 
    self.progressView.progress = progress; 
    self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress*100]; 
} 

Я загружаю файл через NSURLSession, добавленный в iOS 7. Все работает до сих пор, но по какой-то причине пользовательский интерфейс не обновляется. Я проверил, что метод вызывается, и я также могу NSLog прогресса.Не удается обновить пользовательский интерфейс в методах делегатов NSURLSession

Возможно, потому что этот метод называется так часто? Но как вы обновляете свой пользовательский интерфейс, например. если у вас есть индикатор выполнения? Заранее спасибо :)

+0

NSURLSession работает в фоновом режиме по умолчанию, поэтому вам нужно вызвать обновление своего пользовательского интерфейса в основной теме. –

ответ

8

NSURLSession работает в фоновом режиме по умолчанию, поэтому вам нужно вызвать обновление своего пользовательского интерфейса в основном потоке.

dispatch_async(dispatch_get_main_queue(), ^{ 
    // perform on main 
    float progress = (float)((float)totalBytesWritten /(float)totalBytesExpectedToWrite); 
    self.progressView.progress = progress; 
    self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress*100]; 
}); 
+0

@ Martin.Koles, прежде чем я увидел ваш ответ, я изучал это в документах, но не смог найти явное утверждение о том, что методы делегата NSURLSession вызываются из фонового потока. Знаете ли вы, что документы это явно где-то? (Конечно, это подразумевается тем фактом, что NSURLSession предназначен для загрузки фонограмм, но все же. Документы должны явно указывать, что метод будет вызван из фона и поэтому должен быть потокобезопасным.) –

+0

@ DuncanC, no, I не видели его в документах, просто предполагали его по характеру класса и тому, что я читал и слышал. Хорошее чтение: http://www.objc.io/issue-5/from-nsurlconnection-to-nsurlsession.html –

0

В комментариях к ответу Martin «s, Duncan C спросил

(I) не может найти явное утверждение о том, что делегат методы NSURLSession вызываются из фонового потока. Знаете ли вы , если документы указывают это явно где-то?

С documentation из NSURLSession.delegateQueue:

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

Если вы явно не установить delegateQueue на создании сессии

... сеанс создает последовательные очереди операций для выполнения всех вызовов методов делегата и вызовов обработчика завершения.

+0

Для чего это полезно? пожалуйста, заполните ответ/добавьте примеры – voghDev

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