Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone活动指示灯延迟?_Iphone_Objective C_Cocoa Touch_Uiactivityindicatorview - Fatal编程技术网

iPhone活动指示灯延迟?

iPhone活动指示灯延迟?,iphone,objective-c,cocoa-touch,uiactivityindicatorview,Iphone,Objective C,Cocoa Touch,Uiactivityindicatorview,因此,当我在mapView中单击callout附件时,几秒钟内什么都没有发生,因为它正在发出url请求并对其进行解析,所以我想显示活动指示器,以便用户不会认为它已冻结。代码如下: - (void)mapView:(MKMapView *)mv annotationView:(MKAnnotationView *)pin calloutAccessoryControlTapped:(UIControl *)control { // start activity indicator

因此,当我在mapView中单击callout附件时,几秒钟内什么都没有发生,因为它正在发出url请求并对其进行解析,所以我想显示活动指示器,以便用户不会认为它已冻结。代码如下:

- (void)mapView:(MKMapView *)mv annotationView:(MKAnnotationView *)pin calloutAccessoryControlTapped:(UIControl *)control {
    // start activity indicator 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    NSLog(@"tapped");

    ArtPiece *artPiece = (ArtPiece *)pin.annotation;

    //when annotation is tapped switches page to the art description page
    artDescription *artD = [[artDescription alloc] initWithNibName:@"artDescription" bundle:nil];
    artD.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    artD.startingLocation = mapView.userLocation.location.coordinate;
    artD.selectedArtPiece = artPiece;
    NSLog(@"0");
    [self presentModalViewController:artD animated:YES];
    NSLog(@"1");

    [artD loadArt:artPiece];
    NSLog(@"2");
    // stop activity indicator 
    //[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    [artD release];
}

奇怪的是(对我来说,也许我缺少了一些明显的东西,因为我非常缺乏经验),活动指示器直到方法完成后才显示,并且模态视图开始在视图中设置动画。我把NSLogs放进去看看有什么需要时间。我在“0”和“1”之间停顿了大约2秒,在“1”和“2”之间又停顿了几秒。然后,指示器终于显示出来了,所以我确信出于某种原因,它正在等待方法的结束。知道为什么吗?

您不能在同一功能中启动和停止活动指示器

请参见我为这个问题提供的答案:

为清晰起见,请编辑:

- (void) someFunction
{
    [activityIndicator startAnimation];

    // do computations ....

    [activityIndicator stopAnimation];  
}
上述代码将不起作用,因为在当前运行的函数中包含activityIndicator时,您没有给UI时间进行更新。因此,我和其他许多人所做的是将其分解成一条单独的线程,如下所示:

- (void) yourMainFunction {
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

    [NSThread detachNewThreadSelector:@selector(threadStartAnimating) toTarget:self withObject:nil];

    //Your computations

    [activityIndicator stopAnimating];

}

- (void) threadStartAnimating {
    [activityIndicator startAnimating];
}

有东西使你的旋转器变慢了。我建议你在后台用一根线来完成你的繁重工作。试试这个:

-(void)myMethod{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    [NSThread detachNewThreadSelector:@selector(startWorkingThread) toTarget:self withObject:nil];
}

-(void)startWorkingThread{
     //Heavy lifting
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
我假设您已经评论了以下内容:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

出于测试目的…

显示活动指示器的UI更改在控件返回到应用程序的。直到方法结束并且堆栈展开后,才会发生这种情况。您需要显示活动指示器,然后将等待的活动转储到后台线程:

[self performSelectorInBackground:@selector(doThingINeedToWaitFor:)
                       withObject:anObject];
(请注意,Apple you;是从主线程运行某些代码的最简单方法。其他情况下可使用更复杂的选项。请参阅。)

重要的一点是UI更新仍然需要在主线程上处理,因此在该方法中,当工作完成时,您需要回调以停止活动指示器:

- (void) doThingINeedToWaitFor: (id)anObject {
    // Creating an autorelease pool should be the first thing
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // Do your work...
    // ...
    // Update the UI back on the main thread
    [self performSelectorOnMainThread:@selector(allDoneWaiting:)
                           withObject:nil
                        waitUntilDone:YES];
    // Clear out the pool as the final action on the thread
    [pool drain];
}

在回调方法中,再次隐藏活动指示器,并执行任何其他必要的后处理。

UI更改需要在主线程中发生。Activity indicator需要在
yourMainFunction
中启动动画,一个线程需要“分离”(GCD、NSOperation、NSThread、POSIX)来进行计算,然后回调主线程以停止动画制作。那么allDoneWaiting是另一个刚刚完成的方法:[UIApplication sharedApplication].networkActivityIndicatorVisible=是?它可以根据你的需要做其他事情,但基本上是的。任何涉及GUI的代码都需要在主线程上运行。好的,谢谢您的帮助,还有一个问题:它正在崩溃并抱怨自动释放池,我是否需要围绕DothinginedToWaitfor方法中正在执行的操作制作一个自动释放池?是的,新线程需要在其主函数中设置自己的自动释放池。谢谢,这一切似乎都在起作用,我已经检查了你的最佳答案,但。。。由于所有这些都是在后台进行的,因此带有标注的地图视图不会被阻止,因此用户可以选择另一个标注,并在第一个标注仍在工作时单击其附件按钮。是否有一种方法可以在调用单击后阻止UI,使activityindicator仍按其应该的方式更新,但用户在完成之前仍无法交互?