加载数据时如何显示UIActivityIndi​​cationView

| 我试图在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]; 根据乔纳(Jonah)的建议实现多线程:-)     
已邀请:
        您正在主线程中同步加载数据。这意味着负责绘制UI的主线程正忙于加载数据,直到
loadDataIfNeeded
方法完成后才有机会更新视图(此时,您不希望显示自己的活动)指示器仍然可见)。 在主线程上显示活动指示器,然后允许主线程的运行循环继续进行,而是在辅助线程上异步执行昂贵的操作(如加载数据或执行网络请求)。 在
NSThread
NSObject
\的ѭ4and和
NSOperationQueue
中查找用于从主线程执行任务的不同选项。     
        Matt Drance所著的“ IOS食谱”一书中有关于如何做到最好的食谱。您可以从http://media.pragprog.com/titles/cdirec/activity.pdf中免费获得该食谱的摘录。 您可以在http://pragprog.com/titles/cdirec/ios-recipes上的书页上找到该食谱的源代码。     
        在您的viewDidLoad中添加
    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];
    

要回复问题请先登录注册