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