Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Asynchronous request example

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http:///];
NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];
NSURLConnection *con = [[NSURLConnection alloc]initWithRequest:req delegate:self startImmediately:YES];

In my project I used sendSynchronousRequest on NSURLConnection. It gives me crash sometimes.

So I convert this code to AsynchronousRequest. I could not find suitable code.

Somebody give me link or post code which suitable to my code. Any hep will be appreciated.

like image 920
Xcode Avatar asked May 17 '13 11:05

Xcode


People also ask

What is an asynchronous request?

Asynchronous request — Where the client continues execution after initiating the request and processes the result whenever the AppServer makes it available.

How do you send asynchronous request?

You can also send requests synchronously by calling WdfRequestSend, but you have to format the request first by following the rules that are described in Sending I/O Requests Asynchronously. Sending I/O requests to an I/O target synchronously is simpler to program than sending I/O requests asynchronously.

What is asynchronous request response?

The Asynchronous Request-Response conversation involves the following participants: The Requestor initiates the conversation by sending a Request message amd waits for a Response message. The Provider waits for incoming Request messages and replies with Response messages.

What is asynchronous in API?

Asynchronous APIs are also known as async APIs. With an asynchronous process, the availability of a resource, service or data store may not be immediate. The API may have to wait for a backend response. These APIs may provide a callback notification to the requester when the requested resource is ready.


2 Answers

There are couple of things you could do.

  1. You can use sendAsynchronousRequest and handle the callback block.
  2. You can use AFNetworking library, which handles all your requests in asynchronous fashion. Very easy to use and set up.

Code for option 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 (error) {
    //NSLog(@"Error,%@", [error localizedDescription]);
  }
  else {
    //NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
  }
}];

Code for option 2:

You might want to download the library & include it in your project first. Then do the following. You can follow the post on setting up here

NSURL *url = [NSURL URLWithString:@"http://httpbin.org/ip"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"IP Address: %@", [JSON valueForKeyPath:@"origin"]);
} failure:nil];

[operation start];
like image 103
Harish Avatar answered Oct 12 '22 21:10

Harish


As an alternative to NSURLConnection's now deprecated sendAsynchronousRequest:queue:completionHandler: method, you could instead use NSURLSession's dataTaskWithRequest:completionHandler: method:

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

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (!error) {
        // Option 1 (from answer above):
        NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSLog(@"%@", string);

        // Option 2 (if getting JSON data)
        NSError *jsonError = nil;
        NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];
        NSLog(@"%@", dictionary);
    }
    else {
        NSLog(@"Error: %@", [error localizedDescription]);
    }
}];
[task resume];
like image 44
bdev Avatar answered Oct 12 '22 23:10

bdev