Как использовать события пользовательского интерфейса при загрузке данных в фоновом режиме - PullRequest
0 голосов
/ 19 марта 2011

У меня есть небольшое приложение для iPhone, которое загружает данные из веб-службы. Чтобы убедиться, что при загрузке данных ничего не происходит неправильно, я создаю полупрозрачное представление поверх приложения и использую CFRunloopRun (), чтобы дождаться загрузки всех данных в фоновом режиме. Вот код для этого:

        self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

    // Now show an animation
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    UIView *window = [[UIApplication sharedApplication] keyWindow];
    UIView *shield = [[UIView alloc] initWithFrame:window.bounds];
    shield.backgroundColor = [UIColor blackColor];
    shield.alpha = 0.5f;
    [window addSubview:shield];
    spinner.center = shield.center;
    [shield addSubview:spinner];
    spinner.hidden = NO;
    NSLog( @"JCL.callServerWithRequest(), spinner view: %@, shield view: %@, window: %@", spinner, shield, window );
    [spinner startAnimating];

    // Hand over to the Runnloop to wait
    CFRunLoopRun();

    [spinner stopAnimating];
    [spinner removeFromSuperview];
    [spinner release];
    [shield removeFromSuperview];
    [shield release];

Это прекрасно работает, за исключением того, что любые нажатия на кнопки где-то воспроизводятся после загрузки, поэтому, если пользователи дважды нажимают на кнопку загрузки, он также выполнит загрузку дважды.

Любая идея, как использовать события пользовательского интерфейса до снятия щита.

Спасибо - Энди

Ответы [ 2 ]

0 голосов
/ 20 марта 2011

Благодаря Anomie я наконец попытался обойтись без CFRunLoopRun (), и это довольно сложно, потому что выполнение делится на две части: - вызов и возврат результата через обратный вызов. Но затем я выстрелил себе в пресловутую ногу, потому что я пытался заблокировать возвращающийся поток, чтобы замедлить выполнение, которое не работало, потому что это было выполнено снова в основном потоке.

В конце концов я замедлил работу веб-службы, а затем все заработало как положено.

0 голосов
/ 19 марта 2011

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

...