LeviXC
LeviXC

Reputation: 1075

The correct way asynchronously call an object?

I have hobbled together one of my first objects. The goal of the object is to send a text message, which is does. However I'm calling it from the 2nd UIViewController within ViewDidLoad, and its still hanging within the Segue transition. So I know I need to get it asynchronously, but reading some other threads they implied that the proper way to go around it is to make it an "AppDelegate Object", so I would assume I would need to call the object from the AppDelegate, but I'm not really sure about how to go about that as I have not really worked with that in some tutorials I'm doing, and on top of that, is that the correct way to go about using my object?

initializing the object from my view controller

Twilio *twilio = [[Twilio alloc] init];
    [twilio sendMessage: self.phoneNumber: [self getRandomNumberBetween:1000 to:9999]];

Header file

#import <Foundation/Foundation.h>

@interface Twilio : NSObject

@property (strong, nonatomic) NSString *TwilioSID;
@property (strong, nonatomic) NSString *TwilioSecret;
@property (strong, nonatomic) NSString *FromNumber;
@property (strong, nonatomic) NSString *ToNumber;
@property (strong, nonatomic) NSString *Message;

-(id)init;
-(id)sendMessage:(NSString *)phoneNumber :(NSString *)message;

@end

Implementation file

#import "Twilio.h"

@implementation Twilio

-(id)init {
    self = [super init];

    if(self) {
        // Twilio Common constants
        self.TwilioSID = @"A....3";
        self.TwilioSecret = @"e...8";
        self.FromNumber = @"5...2";
        self.ToNumber = nil;
        self.Message = nil;
    }

    return self;
}

-(id)sendMessage:(NSString *)phoneNumber :(NSString *)message
{
    NSLog(@"Sending request.");

    self.ToNumber = phoneNumber;
    self.Message = message;

    // Build request
    NSString *urlString = [NSString stringWithFormat:@"https://%@:%@@api.twilio.com/2010-04-01/Accounts/%@/SMS/Messages", self.TwilioSID, self.TwilioSecret, self.TwilioSID];
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];

    // Set up the body
    NSString *bodyString = [NSString stringWithFormat:@"From=%@&To=%@&Body=%@", self.FromNumber, self.ToNumber, self.Message];
    NSData *data = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
    NSError *error;
    NSURLResponse *response;
    NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    // Handle the received data
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSString *receivedString = [[NSString alloc]initWithData:receivedData encoding:NSUTF8StringEncoding];
        NSLog(@"Request sent. %@", receivedString);
    }
    return self.Message;
}
@end

Updated

With recommendation below I changed my object implementation like so:

    //NSError *error;
    //NSURLResponse *response;
    //NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    [NSURLConnection sendAsynchronousRequest:request queue:self.queue completionHandler:^(NSURLResponse *response, NSData *data, NSError
*error) {

            // Handle the received data
            if (error) {
                NSLog(@"Error: %@", error);
            } else {
                NSString *receivedString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
                NSLog(@"Request sent. %@", receivedString);
            }
            NSLog(@"%@",response);
        }];

Upvotes: 0

Views: 55

Answers (1)

user2828120
user2828120

Reputation: 233

Use method sendAsynchronousRequest:queue:completionHandler:

See it : https://stackoverflow.com/a/9270711/2828120

Upvotes: 1

Related Questions