MBProgressHUD при выходе из системы

Я использую MBProgressHUD, чтобы создать обзорный экран загрузки при выходе из приложения для iPad. Этот прогресс занимает некоторое время, потому что мне нужно зашифровать несколько больших файлов.

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

В качестве теста я сделал это так:

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDAnimationFade;
hud.labelText = @"Do something...";

[self performSelectorInBackground:@selector(doSomethingElse) withObject:nil];

И метод doSomethingElse:

-(void)doSomethingElse
{
    [self encrypt];
    [self performSelectorOnMainThread:@selector(doSomethingElseDone) withObject:nil waitUntilDone:YES];
}

И метод doSomethingElseDone:

-(void)logoutInBackgroundDone
{
    [MBProgressHUD hideHUDForView:self.view animated:YES];    
}

Решение работает, но я думаю, что должен быть лучший способ? Как я могу сделать это лучше?

Любая помощь очень ценится.


person NDY    schedule 19.11.2012    source источник


Ответы (2)


Вы можете напрямую отклонить метод MBProgressHUD from doSomethingElse, используя dispatch_async

-(void)doSomethingElse
{
    [self encrypt];
    dispatch_async(dispatch_get_main_queue(), ^{
         [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
}
person Midhun MP    schedule 19.11.2012
comment
Я люблю это. Но нет возможности обработать конец фонового потока без вызова другого метода? Что-то вроде обратного вызова - просто я знаю, когда закончилось действие PerformSelectorInBackground? - person NDY; 20.11.2012
comment
Я принял это, потому что я использую это так и не нашел лучшего решения. - person NDY; 23.11.2012
comment
@Andy: для выполнения какого-либо действия в конце селектора выполнения в фоновом режиме вам нужно либо вызвать метод, либо опубликовать уведомление. Для этого нет механизма обратного вызова. Проверьте этот вопрос stackoverflow.com/questions/5406803/ - person Midhun MP; 23.11.2012
comment
Спасибо. Кажется, лучшее решение. Так грустно, что нет обратного вызова или чего-то подобного. - person NDY; 23.11.2012

Создайте атомарное свойство, к которому вы можете получить

@property BOOL spinning;

и

- (void)myTask
{
    while ( self.spinning )
    {
        usleep(1000*250); // 1/4 second
    }
}

затем используйте что-то в своем контроллере представления, например

HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];
[HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES];

Таким образом, HUD удалит себя, когда вращение станет ложным. Спиннер должен быть атомарным, поскольку на него будут ссылаться в фоновом потоке. Что бы вы ни ждали, вы можете просто установить для свойства spinner значение false из любого потока, чтобы указать, что это сделано.

Это под АРК.

person ahwulf    schedule 19.11.2012