添加 activity 指示器在网络 activity 启动和停止时启动和停止

add activity indicator to star and stop when network activity star and stop

我正在开发一个使用 Parse Backends 的 iOS 应用程序,我想在我的导航栏中显示 Acctivity Indicator 以在网络 Activity 状态栏中的星标时显示动画,因此停止当网络停止状态栏中的 activity 时,在导航栏中为我的 Activity 指示器设置动画。

self.navigationController.navigationBar.barTintColor = BLUE_COLOR; self.navigationItem.title = @"MyAppname";

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;

}

解析调用是同步的,这意味着它们与您的应用中发生的其他事情同时发生,而不是线性发生。当您调用 [curQuery findObjectsInBackground... 时,您的主线程将生成一个新线程,该线程会调用服务器并最终 运行 您的块中的内容。然后,主线程立即转到 if ([PFUser currentUser]) { 行,在该块执行之前。

您需要在回调块之后立即执行 [activityIndicator startAnimating];,并且您在回调块内做的第一件事是 [activityIndicator stopAnimating];

但是,您可能会在第一次 stopAnimating 调用之前进行第二次 startAnimating 调用,这会产生过早结束 activityIndicator 的意外效果。您必须找到一种方法来跟踪有多少东西正在使用该 activity 指示器。即,创建一个 int 来存储有多少事物正在使用 activityIndicator。如果它为 0,并且您正在尝试启动指标,则递增并启动指标。如果它 > 0,只需增加它,因为它已经 运行ning。执行相反的操作以停止 activity 指标。如果它 > 1,只需递减 int。如果 == 1,则递减为 0 并停止 activity 指标。