添加活动指示器以显示并在网络活动星标和停止时停止

时间:2015-09-12 21:55:56

标签: ios parse-platform uinavigationbar uiactivityindicatorview

我正在开发一个使用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;

}

1 个答案:

答案 0 :(得分:0)

Parse调用是同步的,这意味着它们与应用程序中发生的其他内容同时发生,而不是线性发生。当你调用[curQuery findObjectsInBackground...时,你的主线程将创建一个新的线程,使服务器调用并最终运行你的块内的东西。然后,主线程立即转到if ([PFUser currentUser]) {行,然后执行该块。

你需要在回调块之后立即执行[activityIndicator startAnimating];,而你在回调块中做的第一件事就是[activityIndicator stopAnimating];

但是,您可能会在第一次startAnimating来电前进行第二次stopAnimating来电,这会产生意外结束您的activityIndi​​cator的意外效果。您必须找到一种方法来跟踪有多少东西正在使用该activityIndi​​cator。即,创建一个int,用于存储使用activityIndi​​cator的内容。如果它为0,并且您正在尝试启动指示器,则递增并启动指示器。如果是> 0,只是递增它,因为它已经在运行。停止活动指示器则相反。如果是> 1,只需减少int。如果是== 1,则递减为0并停止活动指示器。