Я не могу определить проблему в коде, который вы разместили;но некоторый рефакторинг может помочь.
Вместо опроса DataManager
вы можете использовать KVO для наблюдения за свойствами на DataManager
и реагирования на эти изменения. («Не звоните нам; мы вам позвоним.) Итак, вот вам предложенный подход, если хотите.
Ваш интерфейс класса:
@interface YourClass : UIViewController // or whatever your superclass is...
{
MBProgressHUD *_hud;
DataManager *_dataManager;
// your other ivars
}
@end
Ив вашем файле реализации ...
@interface YourClass()
@property (nonatomic, retain) DataManager dataManager;
@end
Выше я объявил ваш dataManager как свойство, чтобы мы могли наблюдать его.
Чтобы начать процесс загрузки, у нас теперь есть метод downloadLesson
:
- (void)downloadLesson;
{
// show HUD and retain it (showHUDAddedTo:animated: returns autoreleased object)
MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES] retain];
// observe properties on the dataManager
[self addObserver:self forKeyPath:@"dataManager.progress" options:NSKeyValueObservingOptionNew context:nil];
[self addObserver:self forKeyPath:@"dataManager.cleanedUp" options:NSKeyValueObservingOptionNew context:nil];
[self addObserver:self forKeyPath:@"dataManager.downHUD" options:NSKeyValueObservingOptionNew context:nil];
// begin your download here...
HUD.labelText = NSLocalizedString(@"Connecting", "");
HUD.detailsLabelText = @" ";
HUD.progress = self.dataManager.downHUD;
}
Теперь используйте KVO для обновления внешнего вида HUD:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
{
if( [keyPath isEqualToString:@"dataManager.cleanedUp"] )
{
if( [[[self dataManager] cleanedUp] isEqualToString:@"Yes"] )
{
[MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] keyWindow] animated:YES];
[HUD release]; HUD = nil;
[self removeObserver:self forKeyPath:@"dataManager.progress"];
[self removeObserver:self forKeyPath:@"dataManager.cleanedUp"];
[self removeObserver:self forKeyPath:@"dataManager.downHUD"];
}
}
if( [keyPath isEqualToString:@"dataManager.downHUD"] )
{
// if the data manager updates progress, update our HUD
HUD.progress = self.dataManager.downHUD;
if( self.dataManager.downHUD == 0.0 )
// no progress; we're just connecting
HUD.labelText = NSLocalizedString(@"Connecting", "");
else if( self.dataManager.downHUD < 1.0 )
{
// progress >0.0 and < 1.0; we're downloading
HUD.labelText = NSLocalizedString(@"Downloading", "");
NSString *percent = [NSString stringWithFormat:@"%.0f%%", HUD.progress/1*100];
HUD.detailsLabelText = percent;
}
else
{
// progress == 1.0, but we haven't cleaned up, so unpacking
if( [[[self dataManager] cleanedUp] isEqualToString:@"No"] )
{
HUD.labelText = NSLocalizedString(@"Unpacking","");
HUD.detailLabelsText = @" ";
}
}
}
}
В качестве альтернативы, вы можете использовать уведомления для обновления, где DataManager
сообщений NSNotification
s, для которых ваш контроллер представления зарегистрирован. Или, если вы были открыты для рефакторинга DataManager
, вы могли бы использовать блоки для выполнения обновлений. Все эти решения избегают необходимости явно блокировать ваш поток для опроса DataManager
.Надеюсь, это поможет.