0

アプリが特定の画面を読み込んでいるときに、アクティビティ ホイールで「読み込み中...」ビューを表示するコードがあります。読み込みに特に長い時間がかかる場合 (たとえば 4 秒以上) は、「申し訳ありませんが、時間がかかりすぎて申し訳ありません。しばらくお待ちください!」などの追加メッセージを表示したいと思います。私がこれを行っている方法は、待機ビューを作成するメソッドを呼び出す 4 秒の遅延で NSTimer を使用し、単語が重ならないようにこの新しいビューを読み込みビューにオーバーレイすることです。ページが 4 秒未満で読み込まれると、読み込み中のビューが非表示になり、待機中のビューがトリガーされることはなく、ユーザーは思いのままに進んでいきます。

4 秒以上かかる画面読み込みをテストすると、追加のビューを表示できないようです。これが私のコードです:

// this method is triggered elsewhere in my code
// right before the code to start loading a screen
- (void)showActivityViewer
{     
    tooLong = YES;
    waitTimer = [NSTimer scheduledTimerWithTimeInterval:4.0
                                                   target:self
                                                 selector:@selector(createWaitAlert)
                                                 userInfo:nil
                                                  repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer: waitTimer forMode: NSDefaultRunLoopMode];

    loadingView = [LoadingView createLoadingView:self.view.bounds.size.width     :self.view.bounds.size.height];    
    [self.view addSubview: loadingView];

    // this next line animates the activity wheel which is a subview of loadingView
    [[[loadingView subviews] objectAtIndex:0] startAnimating]; 
}

- (void)createWaitAlert
{
    [waitTimer invalidate];
    if (tooLong) 
    {
        UIView *waitView = [LoadingView createWaitView:self.view.bounds.size.width :self.view.bounds.size.height];
        [self.view addSubview:waitView];
    }
}

// this method gets triggered elsewhere in my code
// when the screen has finished loading and is ready to display
- (void)hideActivityViewer
{
    tooLong = NO;
    [[[loadingView subviews] objectAtIndex:0] stopAnimating];
    [loadingView removeFromSuperview];
    loadingView = nil;
}
4

1 に答える 1

0

これをメインスレッドから実行していますか? これを試して:

- (void)showActivityViewer
{     
    tooLong = YES;

    dispatch_async(dispatch_queue_create(@"myQueue", NULL), ^{
        [NSThread sleepForTimeInterval:4];
        [self createWaitAlert];
    });

    loadingView = [LoadingView createLoadingView:self.view.bounds.size.width     :self.view.bounds.size.height];    
    [self.view addSubview: loadingView];

    // this next line animates the activity wheel which is a subview of loadingView
    [[[loadingView subviews] objectAtIndex:0] startAnimating]; 
}

- (void)createWaitAlert
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (tooLong) 
        {
            UIView *waitView = [LoadingView createWaitView:self.view.bounds.size.width :self.view.bounds.size.height];
            [self.view addSubview:waitView];
        }
    });
}
于 2012-09-21T12:12:10.003 に答える