ios передает данные в MBProgressHUD, заканчивающийся странным сбоем - PullRequest
0 голосов
/ 12 марта 2012

Я извиняюсь в самом начале за этот длинный вопрос.

В моем приложении я загружаю большие видеофайлы (30-60Mb).Я, очевидно, хочу рассказать пользователю о прогрессе.Загрузка от Городского Дирижабля, и я использую один из их методов, чтобы получить прогресс.Однако это происходит в TableViewController, но индикатор загрузки (MBProgressHUD) запускается из другого представления, которое называется UADetail.

Для передачи прогресса из одного вида в другой я использую Singleton.Случайно, это может произойти рано, поздно или вообще не произойдет, приложение вылетает с этим в журнале;

2012-03-12 15: 13: 30.528 isengua-en [3478: 681f] HUDlessonDownloadProgress: 0.053478 2012-03-12 15: 13: 30.553 isengua-en [3478: 707] Ход урока: 0.055272 2012-03-12 15: 13: 30.562 isengua-en [3478: 707] LLVC downHUD прогресс: 0.055272 2012-03-12 15: 13: 30.565 isengua-ru [3478: 707] - [LessonListViewController> productsDownloadProgress: count:] [Строка 57] [StoreFrontDelegate] productsDownloadProgress: 0.055272 count: 1 2012-03-12 15: 13: 30.569 isengua-ru [3478: 6307] * - [CFNumber _getValue: forType:]: сообщение, отправленное на освобожденный экземпляр 0x83c6e80

Первым является LessonListViewController;

- (void)productsDownloadProgress:(float)progress count:(int)count 
{
    DataManager *sharedManager = [DataManager sharedManager];
    sharedManager.downHUD = [NSNumber numberWithFloat:progress];
    NSLog(@"Lessonlist progress: %f", progress);
    NSLog(@"LLVC downHUD progress: %f", [sharedManager.downHUD floatValue]);
    UALOG(@"[StoreFrontDelegate] productsDownloadProgress: %f count: %d", progress, count);
    if (count == 0) {
        NSLog(@"Downloads complete in LessonListView!");
    }

}

Синглтон выглядит так:

@implementation DataManager

@synthesize downHUD;




+ (DataManager *)sharedManager
{
    static DataManager *sharedManager = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        sharedManager = [[self alloc] init]; 
    });
    return sharedManager;

}

- (id)init {
    if (self = [super init]) {
        downHUD = [NSNumber numberWithFloat:(float)0];
    }
    return self;
}


 - (void)dealloc {
 // Should never be called, but just here for clarity really.
     NSLog(@"dealloc called in DataManager");
 }



@end

И затем его читают в UADetail;

- (void)showWithLabelDeterminate {

    HUD = [[MBProgressHUD alloc] initWithView:self.view]; 
    [self.view addSubview:HUD];


    // Set determinate mode
    HUD.mode = MBProgressHUDModeIndeterminate;
    HUD.delegate = self;
    HUD.labelText = NSLocalizedString(@"Waiting","");

    // myProgressTask uses the HUD instance to update progress
    [HUD showWhileExecuting:@selector(lessonDownloadProgress) onTarget:self withObject:nil animated:YES];
}


-(void)lessonDownloadProgress
{
    DataManager *sharedManager = [DataManager sharedManager];
    HUD.mode = MBProgressHUDModeDeterminate;
    HUD.progress = [sharedManager.downHUD floatValue];
    HUD.labelText = NSLocalizedString(@"DownLoading","");

    while (HUD.progress < 1)
    {
        [self parentViewController];
        NSLog(@"HUD lessonDownloadProgress: %f", HUD.progress);
        HUD.progress = [sharedManager.downHUD floatValue];                       
        NSString *percent = [NSString stringWithFormat:@"%.0f", HUD.progress/1*100];
        HUD.detailsLabelText = [percent stringByAppendingString:@"%"];
    }
}

1 Ответ

0 голосов
/ 14 марта 2012

Я думаю, что нашел решение для этого сам. После вставки усла (50000) в петли while он остановился. Возможно, цикл выполнялся слишком быстро и слишком часто проверял sharedManager.downHUD, мешая записи в него из другого класса.

...