问题描述
|
我试图在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,44,44);
activityView.center = self.view.center;
activityView.tag = 99;
[activityView startAnimating];
[self.view addSubview: activityView];
[activityView release];
然后,在完成加载后的加载方法中,只需从超级视图中删除活动指示器即可。
所以在加载后在您的loadDataIfNeeded中添加
[[self.view viewWithTag:99] removeFromSuperview];