programing

sendAsynchronousRequest:queue:completionHandler:

i4 2023. 8. 19. 09:46
반응형

sendAsynchronousRequest:queue:completionHandler:

2부 질문

1부: 데이터베이스에 대한 비동기 요청을 작성하려고 합니다.저는 현재 동기식으로 하고 있지만, 저는 무슨 일이 일어나고 있는지 더 잘 이해할 수 있는 두 가지 방법을 배우고 싶습니다.

현재 저는 동기식 통화를 이렇게 설정했습니다.

- (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];

A 동기화 버전과 함께

sendAsynchronousRequest: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];
}];

다음은 샘플입니다.

NSString *urlAsString = @"http://www.cnn.com";
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];


[NSURLConnection
         sendAsynchronousRequest:urlRequest
         queue:[[NSOperationQueue alloc] init]
         completionHandler:^(NSURLResponse *response,
                             NSData *data,
                             NSError *error) 
        {

         if ([data length] >0 && error == nil)
         {

                        // DO YOUR WORK HERE

         }
         else if ([data length] == 0 && error == nil)
         {
             NSLog(@"Nothing was downloaded.");
         }
         else if (error != nil){
             NSLog(@"Error = %@", error);
         }

     }];

대기열 매개 변수의 경우 다음 마법을 사용합니다.

[NSOperationQueue mainQueue]

메인 큐가 메인 스레드이기 때문에 요청 완료 시 UI를 업데이트하는 경우에는 매우 유용합니다.기본적으로 NSURL 연결의 이전 동작을 제공합니다.그러나 파일에 쓰거나 압축을 풀 계획이라면 백그라운드 대기열에서 완료한 다음 UI 업데이트를 위해 비동기를 다시 기본 대기열로 보낼 수 있습니다.

저도 비슷한 문제를 계속 연구하고 있는데, 이 질문을 올리고 여기서 명확한 을 얻었는데, 2부에 도움이 되었으면 합니다.

파트 1의 경우 여기에 언급된 다른 사람들은 좋지만 다른 체크를 추가해야 합니다(아래 답변을 수정했습니다).요청 시 404 오류(페이지를 찾을 수 없음)가 반환될 수 있으며, 이 경우 오류 및 데이터는 0보다 클 수 있습니다.200은 좋은 반응입니다. 상태 코드 404 또는 무엇이든 확인할 수 있습니다.

     [NSURLConnection
     sendAsynchronousRequest:urlRequest
     queue:[[NSOperationQueue alloc] init]
     completionHandler:^(NSURLResponse *response,
                         NSData *data,
                         NSError *error) 
    {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
     if ([data length] >0 && error == nil && [httpResponse statusCode] == 200)
     {

                    // DO YOUR WORK HERE

     }

부터sendAsynchronousRequest:urlRequest queue:queue completionHandler:iOS 9에서는 더 이상 사용되지 않으며 대신 를 사용할 것을 제안합니다.iOS 7 이상부터 사용할 수 있습니다.

원본:

 NSURL *URL = [NSURL URLWithString:@"http://example.com"];
 NSURLRequest *request = [NSURLRequest requestWithURL:URL];

 [NSURLConnection sendAsynchronousRequest:request
                                    queue:[NSOperationQueue mainQueue]
                        completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
     // ...
 }];

NSURL 세션별:

 NSURL *URL = [NSURL URLWithString:@"http://example.com"];
 NSURLRequest *request = [NSURLRequest requestWithURL:URL];

 NSURLSession *session = [NSURLSession sharedSession];
 NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                         completionHandler:
     ^(NSData *data, NSURLResponse *response, NSError *error) {
         // ...
     }];

 [task resume];

sendAsynchronousRequest스위프트에서 더 이상 사용되지 않습니다.다음으로 이동dataTaskWithRequest다행히도 그것은 거의 같은 방식으로 사용됩니다.

if let url = NSURL(string:"http://your_url") {

    let request:NSURLRequest = NSURLRequest(URL: url)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)

    let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in

    });

    task.resume()
}

언급URL : https://stackoverflow.com/questions/9270447/how-to-use-sendasynchronousrequestqueuecompletionhandler

반응형