1

したがって、私は通常、Android用のアプリを作成し、非同期タスクを使用してメソッドを呼び出してバックグラウンドで実行し、アラートダイアログが「読み込み中」などと言って再生します。このアプリでは、iOS に変換しようとしています。さまざまな Web サイトからのデータを解析し、いくつかの Web 画像を表示しています。これらすべてが読み込まれている間、アラート ダイアログを再生したいと考えています。何時間も探していましたが、探している解決策が見つかりませんでした。誰かが私をチュートリアルや正しい方向に向けてくれることを望んでいました.

これが私が取り組んでいるものです:

- (void) RSEpic{
NSURL * imageURL = [NSURL URLWithString:RSEimageURL];
NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage * image = [UIImage imageWithData:imageData];
_RSEImage.image = image;
[self waterTemp];
}

- (void) waterTemp{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
/* set headers, etc. on request if needed */
[request setURL:[NSURL URLWithString:@"http://waterdata.usgs.gov/usa/nwis/uv?02035000"]];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL       error:NULL];
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSScanner *scanner = [NSScanner scannerWithString:html];
NSString *token = nil;
[scanner scanUpToString:@"<table id=\"table_12_00010\"" intoString:NULL];
[scanner scanUpToString:@"&nbsp" intoString:&token];
NSArray *words = [token componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@":"]];
double temp = [words[1] doubleValue];
_waterTempC.Text = [NSString stringWithFormat:@"%.2f°C",temp];
_waterTempF.Text = [NSString stringWithFormat:@"%.2f°F",temp*9/5+32];
[self waterDepth];
}

- (void) waterDepth{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
/* set headers, etc. on request if needed */
[request setURL:[NSURL URLWithString:@"http://waterdata.usgs.gov/va/nwis/uv?02037500"]];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL];
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSScanner *scanner = [NSScanner scannerWithString:html];
NSString *token = nil;
[scanner scanUpToString:@"<table id=\"table_07_00065\"" intoString:NULL];
[scanner scanUpToString:@"&nbsp" intoString:&token];
NSArray *words = [token componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@":"]];
double temp = [words[1] doubleValue];
_waterLevel.Text = [NSString stringWithFormat:@"%.2fFT",temp];
if (temp >= 9.0) {
    _levelAlert.text = @"HIGH WATER PERMIT REQUIRED";
    }
else if (temp >= 5.0){
    _levelAlert.text = @"LIFE JACKET REQUIRED";
}
else {
    _levelAlert.text = @"";
}
[self tempChart];
}

- (void) tempChart{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
/* set headers, etc. on request if needed */
[request setURL:[NSURL URLWithString:@"http://waterdata.usgs.gov/nwis/uv/?dd_cd=12_00010&format=img_default&site_no=02035000&set_arithscale_y=on&period=7"]];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL];
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSScanner *scanner = [NSScanner scannerWithString:html];
NSString *token = nil;
[scanner scanUpToString:@"http" intoString:NULL];
[scanner scanUpToString:@"\"" intoString:&token];
NSLog(@"%@",token);
NSURL * imageURL = [NSURL URLWithString:token];
NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage * image = [UIImage imageWithData:imageData];
_chartImage.image = image;
}

- (void) depthChart{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
/* set headers, etc. on request if needed */
[request setURL:[NSURL URLWithString:@"http://waterdata.usgs.gov/va/nwis/uv/?dd_cd=07_00065&format=img_default&site_no=02037500&set_arithscale_y=on&period=7"]];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL];
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSScanner *scanner = [NSScanner scannerWithString:html];
NSString *token = nil;
[scanner scanUpToString:@"http" intoString:NULL];
[scanner scanUpToString:@"\"" intoString:&token];
NSLog(@"%@",token);
NSURL * imageURL = [NSURL URLWithString:token];
NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage * image = [UIImage imageWithData:imageData];
_chartImage.image = image;
}

- (void) progressAlert {
// initialize our Alert View window without any buttons
baseAlert=[[UIAlertView alloc]initWithTitle:@"Please wait,\ndownloading updates...." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil];

// Display our Progress Activity view
[baseAlert show];

// create and add the UIActivity Indicator
UIActivityIndicatorView
*activityIndicator=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.center=CGPointMake(baseAlert.bounds.size.width
                                     / 2.0f,baseAlert.bounds.size.height-40.0f);

// initialize to tell our activity to start animating.
[activityIndicator startAnimating];
[baseAlert addSubview:activityIndicator];

// automatically close our window after 3 seconds has passed.
[self performSelector:@selector(showProgressDismiss)withObject:nil afterDelay:3.0f];

}
- (void) showProgressDismiss
{
[baseAlert dismissWithClickedButtonIndex:0 animated:NO];
}
@end

では、このすべてがロードされている間に baseAlert を表示および非表示にする方法を教えてもらえますか?

4

3 に答える 3

2

dispatch_group_t を使用し、すべてのスレッドが完了すると、次のように通知を呼び出すことができます。

        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            [self doAnExpensiveOperation];
        });
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            [self doAnotherExpensiveOperation];
        });
        dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{

            dispatch_async(dispatch_get_main_queue(), ^{

                // called when both background threads have finished.
                // Update UI elements here
            });

        });

優先順位を付けます:

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            [self doAnotherExpensiveOperation];
        });
于 2013-07-02T00:22:13.080 に答える
0

簡単かつ簡潔にするために、次のようにして、OS に別のスレッドでコードを実行するように指示できます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Insert your code here
});

グローバル キューとは、ブロックを GCD に送信することを意味し、OS はそのブロックを便利なスレッドで実行しますが、メイン スレッド (UI が実行される場所) は除きます。UI を更新する (たとえば、アラートを非表示にしたり、アクティビティ インジケーターを停止したりする) 場合は、メイン スレッド (main_queue) で行う必要があることに注意する必要があります。したがって、私たちが常に使用するテンプレートは次のとおりです。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Process your heavy code here.
    dispatch_async(dispatch_get_main_queue(), ^{
        //Update your UI here.
    });
});

これは、ARC を使用している場合に保持サイクルを回避するために非常に重要です。

Apple がここselfで述べているように、保持カウントがインクリメントされるブロック内で使用する iVar の場合と同様に、ブロック内への弱い参照を使用する必要があります。

@danypata によって提案されたチュートリアルをお勧めします。これは良いものです。同じサイトで、役に立つチュートリアルがたくさんあります!!

素晴らしい一日をお過ごしください。お役に立てば幸いです。

于 2013-07-02T00:18:01.540 に答える