У меня есть приложение IPad, и я хочу, чтобы это сделатьДождитесь результата без остановки UI
-(IBAction) clicked {
image=download(@"http://....."); // this is on the main thread
}
Функция загрузки будет вызывать целую кучу, не являющихся функциями блокировки, чтобы загрузить файл из Интернета, но сама загрузка не должна возвращаться до загрузки изображения.
Хотя программа ожидает загрузки на рисунке = download (...) выше, я хочу, чтобы пользовательский интерфейс мог функционировать, например, иметь возможность прокручивать UITableView, нажимать другую кнопку и т. Д.
так что я сделал это в функции загрузки я использовал RunLoop
-(void) download:(NSString *)url
{
BOOL stillDownloading=TRUE;
while(stillDownloading) {
stillDownloading=downloadAFwBytes(...);
CFRunLoopRunInMode(kCFRunLoopCommonModes, 0, YES);
}
}
Я думал, что функция CFRunLoopRunInMode будет держать насосные сообщения UI, прикасается, прокручивают основной поток пользовательского интерфейса, так что пользовательский интерфейс будет держать работая и не замерзая, пока загрузка не закончится, но по какой-то причине она работает только на короткое время, и в конечном итоге замораживание пользовательского интерфейса s.
Знаете ли вы, почему, или как исправить?
Функция загрузки называется повсюду в программе, которая ожидает, что она ждет загрузки, поэтому я не могу ее изменить до момента блокировки.
Я знаю, что это не отличный способ, но есть ли способ заставить его работать так, я поменяю его позже, но сейчас нет времени! –
@NS Конечно, есть время, вы должны изменить его сейчас, его не так уж сложно ... – Daniel
выше это упрощение реальной вещи, которая намного сложнее. Чтобы изменить это, потребуется массивная типизация, я думал, что могу добавить что-то в цикл выше, чтобы обрабатывать сообщения пользовательского интерфейса, пока все еще находится в цикле while? Это возможно? –