1. ホーム
  2. iphone

sendAsynchronousRequest:queue:completionHandler の使用方法について。

2023-11-17 14:29:45

質問

二者択一の質問

第一部 私はデータベースへの非同期リクエストを作成しようとしています。私は現在、同期的にそれを行っていますが、私は何が起こっているのか理解を深めるために両方の方法を学びたいと思っています。

現在、私はこのように同期呼び出しをセットアップしています。

- (IBAction)setRequestString:(NSString *)string
{
    //Set database address
    NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http://127.0.0.1:8778/instacodeData/"]; // imac development

    //PHP file name is being set from the parent view
    [databaseURL appendString:string];

    //call ASIHTTP delegates (Used to connect to database)
    NSURL *url = [NSURL URLWithString:databaseURL];

    //SynchronousRequest to grab the data
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSError *error;
    NSURLResponse *response;

    NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if (!result) {
        //Display error message here
        NSLog(@"Error");
    } else {

        //TODO: set up stuff that needs to work on the data here.
        NSString* newStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
        NSLog(@"%@", newStr);
    }
}

私は、私が行う必要があるのは、呼び出しを置き換えることだと思います。

NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

ASynchronousバージョンで

sendAsynchronousRequest:queue:completionHandler:

というような感じで作っているのですが、queueやcompletionHandlerに何を渡せばいいのかよくわかりません...。何か例や解決策があれば、非常にありがたいです。

パート2です。 私はマルチタスクについて読んできましたが、割り込みがあった場合に接続要求が完了することを確認することによって、それをサポートしたいと思います。私はこの

その中で、割り込みが発生した場合に時間を稼ぐ方法を説明していますが、それが何をやっているかは理解できます。

どのように解決するのですか?

第1段階

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
    if ([data length] > 0 && error == nil)
        [delegate receivedData:data];
    else if ([data length] == 0 && error == nil)
        [delegate emptyReply];
    else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
        [delegate timedOut];
    else if (error != nil)
        [delegate downloadError:error];
}];