Iphone 加载数据时如何显示UIActivityIndicationView

Iphone 加载数据时如何显示UIActivityIndicationView,iphone,objective-c,uiactivityindicatorview,Iphone,Objective C,Uiactivityindicatorview,我试图在viewDidLoad中加载数据时显示指示器视图,但加载在我显示指示器之前开始,我想这是因为视图直到之后才加载。我已经读了一些关于这方面的文章,但就是不能让它发挥作用 我想要的是在将文件加载到数据库的过程中显示活动指示器 我一直在做测试,所以代码结构可能看起来有点奇怪 如果数据从.txt文件加载到数据库中,请给我一个提示或链接,如何修复此问题,以便在/if时显示活动指示器 - (void)viewDidLoad { [super viewDidLoad]; self.title = @"

我试图在viewDidLoad中加载数据时显示指示器视图,但加载在我显示指示器之前开始,我想这是因为视图直到之后才加载。我已经读了一些关于这方面的文章,但就是不能让它发挥作用

我想要的是在将文件加载到数据库的过程中显示活动指示器

我一直在做测试,所以代码结构可能看起来有点奇怪

如果数据从.txt文件加载到数据库中,请给我一个提示或链接,如何修复此问题,以便在/if时显示活动指示器

- (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];
}
}
问题已解决

我换了电话

[自行加载数据(如果需要]

[NSThread detachNewThreadSelector:@selector(LoadDataIfRequired)to target:self with object:nil]

为了根据Jonah的建议实现多线程:-)

Matt Drance的《IOS配方》一书中有一个配方,讲述了如何做到最好。你可以从以下网站免费获得这本食谱:


您可以在viewDidLoad add中的书籍页面上找到配方的源代码

    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中,在加载add之后


[[self.view view with tag:99]从SuperView中移除]

您正在主线程中同步加载数据。这意味着负责绘制UI的主线程正忙于加载您的数据,并且在
loadDataIfNeeded
方法完成之前没有机会更新您的视图(此时您无论如何都不想再显示活动指示器)

在主线程上显示活动指示器,然后允许主线程的运行循环继续,而不是在辅助线程上异步执行昂贵的操作(如加载数据或执行网络请求)


查看
NSThread
NSObject
-performSelectorInBackground:withObject:
,以及
NSOperationQueue
,了解在主线程之外执行任务的不同选项。

在遇到问题时,您可以使用hides而不是hidden属性-(…仍然是相同的黑屏)