Ios 目标-循环运行时的C延迟

Ios 目标-循环运行时的C延迟,ios,objective-c,mkannotation,Ios,Objective C,Mkannotation,我试图在ObjuleC中编写一个for循环,它将显示一组注释视图,这些注释视图中的每一个将依次在屏幕中间用图片创建一个自定义的标注视图(只是一个 uiVIEW>代码>子类)。p> 但是,我希望用户能够保持调用视图并暂停for循环(延迟循环继续,直到用户放开屏幕),当他们放开屏幕时,for循环应该继续并立即转到下一个annotationView 示例代码: -(void)displayAnnotation:(MKAnnotationView *)view { // ..blah blah

我试图在ObjuleC中编写一个for循环,它将显示一组注释视图,这些注释视图中的每一个将依次在屏幕中间用图片创建一个自定义的标注视图(只是一个<代码> uiVIEW>代码>子类)。p> 但是,我希望用户能够保持调用视图并暂停for循环(延迟循环继续,直到用户放开屏幕),当他们放开屏幕时,for循环应该继续并立即转到下一个annotationView

示例代码:

-(void)displayAnnotation:(MKAnnotationView *)view
{
    // ..blah blah blah
    // ..display some UIView

    // ..delay a second before returning
}

-(void)displayAllAnnotations:(NSMutableArray *)arrayOfAnnotationViews
{
    for (id annotationView in arrayOfAnnotationViews)
    {
        [self displayAnnotation:annotationView]

        // <NEED CODE HERE>
        // <If user holds screen, pause this loop from continuing>
        // <If user lets go, continue loop immediately to next picture>
    }
}
-(void)displayAnnotation:(MKAnnotationView*)视图
{
//……诸如此类
//…显示一些UIView
//…返回前延迟一秒钟
}
-(void)displayAllAnnotations:(NSMutableArray*)ArrayOfNotationView
{
对于(ArrayOfNotationView中的id注释视图)
{
[自显示注释:注释视图]
// 
// 
// 
}
}

如果您需要其他信息,请告诉我。

要延迟,请尝试以下方法:

double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    //code to be executed on the main queue after delay
});

您不能为此使用for循环,因为您在执行for循环时阻塞了主线程。这意味着您的视图在for循环结束之前不会接收触摸事件

我建议改用dispatch\u async。一个粗略的例子是:

@interface MyClass : NSObject
@property (nonatomic) NSUInteger viewIdx;
@property (nonatomic) NSArray *arrayOfAnnotationViews;
@property (nonatomic) BOOL userIsTappingScreen;
@end

@implementation MyClass

-(void)displayAnnotation:(MKAnnotationView *)view
{
    // ..blah blah blah
    // ..display some UIView
}

-(void)continueIteration
{
    dispatch_async(dispatch_get_main_queue(), ^{
        MKAnnotationView *view = self.arrayOfAnnotationViews[self.viewIdx];
        [self displayAnnotation:view];
        self.viewIdx++;
        if (user is tapping the screen) {
            self.userIsTappingScreen = YES;
        }
        else {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self continueIteration];
            });
        }
    });
 }

 -(void)displayAllAnnotations:(NSMutableArray *)arrayOfAnnotationViews
 {
     self.viewIdx = 0;
     self.arrayOfAnnotationViews = arrayOfAnnotationViews;
 }

 // This method need to be called by your code when the user lifts the finger from the screen
 -(void)userHasSoppedTappingTheScreen
 {
    if (self.userIsTappingScreen) {
        [self continueIteration];
    }
 }

 @end

您将需要一种不同的方法。您不能使用简单的for循环,因为它在执行用户交互时不可能发生。您将需要安排一个重复的
NSTimer
,并使用它移动到下一个注释。然后,您可以检测触碰上/下事件并暂停进程。。。事实上:它被称为事件驱动编程。周期性事件由计时器触发。用户交互由触摸事件触发。您编写代码来响应这些事件。您不会试图篡夺操作系统的整体事件处理。我如何将参数传入NSTimer?或者更确切地说。。如何跟踪NSMutableArray的哪个部分?是否有一个健壮的解决方案,或者我只需要一些全局int计数器来跟踪我在阵列中的位置?你永远不需要全局int计数器。最坏的情况是使用实例变量。如果您想将状态与计时器关联,您可以使用它的
userInfo
。非常感谢。还有一个问题:有没有办法使NSTimer的点火时间更准确?我知道你可以容忍,但即使这样也不太好。我怎样才能使射击更精确?