2016-12-15 8 views
0

Я думаю, что понимаю, как работает следующее, но будет признателен за подтверждение.IOS/Objective-C: возвращение в основной поток

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL: dataUrl]; 
    [self fetchData:data];//go to web, get data and store in core data 
} 
dispatch_async(dispatch_get_main_queue(), ^{ 
    //display new data on main thread. 
} 

Мой вопрос не может принять это как должное, что дисплей на главном потоке не будет происходить до тех пор, после завершения все, что происходит в фоновом режиме - независимо от того, как долго?

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

+0

это правильно. но что вы имеете в виду с «дисплеем не ...»? Как «дисплей» ничего не делает. –

+0

Вызов '[NSData dataWithContentsOfURL]' может выполнять сетевой запрос из Интернета, в зависимости от того, где URL указывает на. Если это URL-адрес файла, указывающий на файл в локальной файловой системе, он просто извлекает данные из локального файла. Если это удаленный URL-адрес, например 'http: // foo/bar.jpg, то он будет SYNCHRONOUSLY извлекает данные с удаленного сервера –

ответ

2

Ваш неправильный код. Вы пытаетесь обновить пользовательский интерфейс задолго до того, как данные будут извлечены из URL-адреса.

Понадобится:

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL: dataUrl]; 
    [self fetchData:data];//go to web, get data and store in core data 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //display new data on main thread. 
    } 
} 

Этот код также предполагает, что fetchData: не асинхронным смысл, что он не вернется, пока данные не будут уже извлечены и обновлены.

+0

Итак, предоставляю ли я отправку в основную очередь внутри dispatch_asynch, она будет ждать, пока данные извлечения будут завершены? – Arjun

+0

Да, это ничем не отличается от другого вызова метода. Но, как я уже сказал, это работает только в том случае, если реализация 'fetchData:' не возвращается до тех пор, пока данные не будут извлечены и сохранены в основных данных. Если его реализация является асинхронной, то функция 'fetchData:' вернется слишком рано. Затем решение должно добавить обработчик завершения для 'fetchData'. – rmaddy

+0

Я чувствую, что вы не понимаете, как работают функции async. Функция async возвращается немедленно, прежде чем задача будет завершена. –

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

  • Нет связанных вопросов^_^