Как показать UIActivityIndicationView при загрузке данных - PullRequest
0 голосов
/ 15 июня 2011

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

Что мне нужно, так это отображать индикатор активности во время загрузки файлов в базу данных.

У меня естьпроводил тестирование, чтобы структура кода выглядела немного странно.

Может, кто-нибудь подойдет, пожалуйста, дайте мне подсказку или ссылку, как это исправить, чтобы индикатор активности отображался, когда / если данные загружаются из.txt файлы в БД?

- (void)viewDidLoad {
[super viewDidLoad];
self.title = @" ";

loadActivityIndicator.hidden = TRUE;  // Hide UIActivityIndicationView at start



[self loadDataIfNeeded];
}

-(void)loadDataIfNeeded {
NSFileManager *fileManager = [NSFileManager defaultManager];

myFileArray = [[NSMutableArray alloc]init];

//======SET THE FILE INPUT NAME======//
qFileTxtName = @"110615";
[myFileArray addObject:qFileTxtName];
//===================================//

// CHECK IF THE FILE EXISTS
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"checkQuestionFile.plist"];

if([fileManager fileExistsAtPath:path]) {
    NSArray *readKeyFileName = [[NSArray alloc] initWithContentsOfFile:path];

    if ([[readKeyFileName objectAtIndex:0] isEqualToString:qFileTxtName]) {
        //==== THERE IS NO UPDATED QUESTION .txt FILE ====//
    }
    else {
        //==== THERE IS AN UPDATED QUESTION .txt FILE ====//

        //  SET UP UIActivityIndicator view to show that work is ongoing
        loadActivityIndicator.hidden = FALSE;
        [loadActivityIndicator startAnimating];


        //==== SET UP PATH FOR ALL FILES====//

        NSString *aString = [[NSString alloc]init];

        aString = [@"questions_famquiz_hard_" stringByAppendingString:qFileTxtName];
        NSString *path1 = [[NSBundle mainBundle] pathForResource:aString ofType:@"txt"];

        aString = [@"questions_famquiz_medium_" stringByAppendingString:qFileTxtName];
        NSString *path2 = [[NSBundle mainBundle] pathForResource:aString ofType:@"txt"];

        aString = [@"questions_famquiz_easy_" stringByAppendingString:qFileTxtName];
        NSString *path3 = [[NSBundle mainBundle] pathForResource:aString ofType:@"txt"];


        AccessQuestionsDB *accessQuestionDataFunction = [AccessQuestionsDB new];
        idCounter = [accessQuestionDataFunction populateTheDatabase: path1 theID:0 firstTime: YES];
        idCounter = [accessQuestionDataFunction populateTheDatabase: path2 theID:idCounter firstTime: NO];
        idCounter = [accessQuestionDataFunction populateTheDatabase: path3 theID:idCounter firstTime: NO];


        //==UPDATE THE PLIST==//
        [myFileArray writeToFile:path atomically: TRUE];

        //  Stop UIActivityIndicator as activity is over
        loadActivityIndicator.hidden = TRUE;
        [loadActivityIndicator stopAnimating];


    }



} else {
    //== If file not found write a new file ==//
    [myFileArray addObject:qFileTxtName];
    [myFileArray writeToFile:path atomically: TRUE];
}
}

ПРОБЛЕМА РЕШЕНА

Я заменил вызов

[self loadDataIfNeeded];

с;

[NSThread detachNewThreadSelector: @selector (loadDataIfNeeded) toTarget: self withObject: nil];

для достижения многопоточности в соответствии с рекомендациями Ионы: -)

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Вы загружаете свои данные синхронно в основной теме.Это означает, что основной поток, отвечающий за отрисовку пользовательского интерфейса, загружает ваши данные и не сможет обновить ваше представление до тех пор, пока не завершится метод loadDataIfNeeded (после чего вы не хотите показывать свойиндикатор активности должен быть виден в любом случае).

Отображение индикатора активности в главном потоке, но затем продолжение цикла выполнения основного потока и вместо этого выполнение дорогостоящих операций (таких как загрузка данных или выполнение сетевых запросов) асинхронно надополнительный поток.

Посмотрите на NSThread, NSObject s -performSelectorInBackground:withObject: и NSOperationQueue для различных вариантов выполнения задач вне основного потока.

0 голосов
/ 15 июня 2011

По вашему мнениюDidLoad добавить

    UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityView.frame = CGRectMake(0, 0, 44, 44);
    activityView.center = self.view.center;
    activityView.tag = 99;
    [activityView startAnimating];

    [self.view addSubview: activityView];

    [activityView release];

Затем в вашем методе загрузки после окончания загрузки просто удалите индикатор активности из супер просмотра.

Так что в ваш loadDataIfNeeded после загрузки добавьте

[[self.view viewWithTag:99] removeFromSuperview];

0 голосов
/ 15 июня 2011

В книге «Рецепты IOS» Мэтта Дранса есть рецепт, рассказывающий о том, как сделать это лучше всего.Вы можете получить этот рецепт как бесплатный отрывок из книги на http://media.pragprog.com/titles/cdirec/activity.pdf

. Вы можете найти исходный код рецепта на странице книги на http://pragprog.com/titles/cdirec/ios-recipes

...