我正在开发一个使用Parse Backends的iOS应用程序,并且我想在我的导航栏中显示Acctivity Indicator,当网络Activity在状态栏中出现星标时为其设置星标,因此当导航栏中的活动指示器停止动画时网络停止状态栏中的活动。
self.navigationController.navigationBar.barTintColor = BLUE_COLOR; self.navigationItem.title = @" MyAppname&#34 ;;
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
[self navigationItem].rightBarButtonItem = barButton;
activityIndicator.hidesWhenStopped = YES;
//[activityIndicator startAnimating];
self.photoArray =[[NSMutableArray alloc]init];
PFQuery* curQuery = [UserParseHelper query];
[curQuery whereKey:@"username" equalTo:[UserParseHelper currentUser].username];
[curQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
self.mainUser = objects.firstObject;
if (self.mainUser.geoPoint != nil) {
[self queryParseMethod];
} else {
[self currentLocationIdentifier];
}
}];
if ([PFUser currentUser]) {
PFQuery *usr = [UserParseHelper query];
[usr whereKey:@"objectId" equalTo:[UserParseHelper currentUser].objectId];
[usr findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
self.userStart = [UserParseHelper alloc];
self.userStart = objects.firstObject;
self.userStart.online = @"yes";
[self.userStart saveEventually];
}];
}
self.segmentedControl.selectedSegmentIndex = 2;
}
答案 0 :(得分:0)
Parse调用是同步的,这意味着它们与应用程序中发生的其他内容同时发生,而不是线性发生。当你调用[curQuery findObjectsInBackground...
时,你的主线程将创建一个新的线程,使服务器调用并最终运行你的块内的东西。然后,主线程立即转到if ([PFUser currentUser]) {
行,然后执行该块。
你需要在回调块之后立即执行[activityIndicator startAnimating];
,而你在回调块中做的第一件事就是[activityIndicator stopAnimating];
但是,您可能会在第一次startAnimating
来电前进行第二次stopAnimating
来电,这会产生意外结束您的activityIndicator的意外效果。您必须找到一种方法来跟踪有多少东西正在使用该activityIndicator。即,创建一个int,用于存储使用activityIndicator的内容。如果它为0,并且您正在尝试启动指示器,则递增并启动指示器。如果是> 0,只是递增它,因为它已经在运行。停止活动指示器则相反。如果是> 1,只需减少int。如果是== 1,则递减为0并停止活动指示器。