how to use sendAsynchronousRequest:queue:completionHandler:

前端 未结 6 1637
你的背包
你的背包 2020-11-27 10:30

Two part question

Part one: I am trying to create an ASynchronous request to my database. I am currently doing it Synchronously however I want to le

相关标签:
6条回答
  • 2020-11-27 11:09

    sendAsynchronousRequest has been deprecated in Swift. Move to dataTaskWithRequest, luckily it is used pretty much the same way.

    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()
    }
    
    0 讨论(0)
  • 2020-11-27 11:15

    I have been working on a similar problem, I posted this question and got a clear answer here, I hope that helps with Part 2.

    For part 1 what the others mentioned here are good but you need to add another check (I have modified an answer below). It is possible that your request will return say a 404 Error (page not found) in which case you will not get and error and data will be > 0. The 200 is a good response, you could also check the StatusCode for 404 or whatever.

         [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
    
         }
    
    0 讨论(0)
  • 2020-11-27 11:18

    Since sendAsynchronousRequest:urlRequest queue:queue completionHandler: has been deprecated in iOS 9, and it will suggest to use NSURLSession's -dataTaskWithRequest:completionHandler: instead. It is available since iOS 7 and later.

    Original:

     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) {
         // ...
     }];
    

    By NSURLSession:

     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];
    
    0 讨论(0)
  • 2020-11-27 11:27

    For the queue param, try this magic:

    [NSOperationQueue mainQueue]
    

    This works great if you are updating the UI on completion of the request since main queue is the main thread. It essentially gives you the previous behavior of NSURLConnection. If however you plan on writing to file or decompressing then you can complete on a background queue and then dispatch async back to the main queue for the UI updates.

    0 讨论(0)
  • 2020-11-27 11:33

    PArt 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];
    }];
    
    0 讨论(0)
  • 2020-11-27 11:34

    Here is a sample:

    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);
             }
    
         }];
    
    0 讨论(0)
提交回复
热议问题