2

httpリクエストを送信して応答を取得している間、アプリがGUIをロックしないようにしたいので、試してみましたが、メインスレッドの外でuikitを使用していると不平を言います。httpとを分離する適切な方法を教えてください。ギー?

-(void)parseCode:(NSString*)title{

    UIActivityIndicatorView *spinner;
    spinner.center = theDelegate.window.center;
    spinner.tag = 12;
    [theDelegate.window addSubview:spinner];
    [spinner startAnimating];

    dispatch_queue_t netQueue = dispatch_queue_create("com.david.netqueue", 0);

    dispatch_async(netQueue, ^{
        NSString *url =[NSString stringWithFormat:@"http://myWebService.org/"];
        // Setup request
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:url]];
        [request setHTTPMethod:@"POST"];
        NSString *contentType = [NSString stringWithFormat:@"application/x-www-form-urlencoded"];
        [request addValue:contentType forHTTPHeaderField:@"Content-Type"];

        NSMutableString *data = [[NSMutableString alloc] init];
        [data appendFormat:@"lang=%@", @"English"];
        [data appendFormat:@"&code=%@", theDelegate.myView.text ];
        [data appendFormat:@"&private=True" ];
        [request setHTTPBody:[data  dataUsingEncoding:NSUTF8StringEncoding]];
        NSHTTPURLResponse *urlResponse = nil;
        NSError *error = [[NSError alloc] init];

        NSData *responseData = [NSURLConnection sendSynchronousRequest:request
                                             returningResponse:&urlResponse
                                                         error:&error];

        NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];


        dispatch_async(dispatch_get_main_queue(), ^{

            [spinner stopAnimating];
            [spinner removeFromSuperview];
            [self presentResults:result];
        });

    });

}
4

3 に答える 3

1

を使用する代わりに、要求を非同期で送信する をNSURLConnection:sendSynchronousRequest使用します。NSURLConnection:initWithRequest:delegate:startImmediately:デリゲート メソッドを使用しNSURLConnection:connectionDidFinishLoadingて応答を処理します。

Apple はURL Loading System Programming Guideで例を提供しています。

に設定startImmediatelyするYESと、リクエストの呼び出し元と同じ実行ループでデリゲート メソッドが呼び出されます。ほとんどの場合、これはメインの実行ループになるため、スレッドの問題を心配することなく、デリゲート メソッドで必要なだけ UI を変更できます。

于 2013-05-31T13:54:29.290 に答える