Cybernetic
Cybernetic

Reputation: 13334

AFNetworking 2.0 implementation code not working

I am trying to implement AFNetworking code to communicate with a web API. I am getting the following errors in the code:

No visible @interface for APIClass declares the selector registerHTTPOperationClass

No visible @interface for APIClass declares the selector setDefaultHeader:Value

No visible @interface for APIClass declares the selector multiPartFormRequestWithMethod:path:parameters:constructingBodyWithblock

Obviously something to do with the new AFNetworking 2.0 migration...however I have been looking at all the migration posts and documentation and connot find the replacements for these without throwing an error:

// add the location details of the web service we wrote
#define kAPIHost @"http://myurl"
#define kAPIPath @"mywebapi/"

@implementation APIClass

// this is the implementation of the singleton method
+(APIClass*)sharedInstance{

static APIClass *sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
    sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:kAPIHost]];
});
return sharedInstance;
}


-(APIClass*)init{
// call super init
self = [super init];

if (self != nil){
     user = nil;
    [self registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    // Accept HTTP header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
    [self setDefaultHeader:@"Accept" value:@"application/json"];
}

return self;

}



// call to the server
-(void)commandWithParams:(NSMutableDictionary*)params onCompletion:
(JSONResponseBlock)completionBlock
{  
    // prepare e POST request by creating an NSMutableURLRequest instance using the
    // parameters we want to send via POST
    NSMutableURLRequest *apiRequest =
    [self multipartFormRequestWithMethod:@"POST"
                                    path:kAPIPath
                              parameters: params
               constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
                   // attach file if needed

               }];
    // create an operation to handle the network communication in the background
    // and intialize it with the POST request we just prepared
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:
                                         apiRequest];
    // now set the 2 blocks needed for success and failure
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id
                                               responseObject)


     {
         // success! - if the call is successful then we just pass in the JSON response
         NSLog(@"responseObject: %@", responseObject);
         completionBlock(responseObject);

     }
     // if there is a failure in the network call then we call the failure block
     // and contrcut a new dictinary to hold the message of the network error
                                     failure:^(AFHTTPRequestOperation *operation, NSError * error) {
                                         //failure!
                                         completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription]forKey:@"error"]);
                                     }];

    // at this point we can call the start method so that AFNetworking can do its
    // magic in the background
    [operation start];
}
@end

Upvotes: 2

Views: 958

Answers (1)

hgwhittle
hgwhittle

Reputation: 9426

You're getting these errors because the methods you're calling aren't methods of whatever class you're subclassing. I'll assume you're subclassing AFHTTPSessionManager, which is recommended for iOS 7 in AFNetworking 2.0. Based on that...

For your first two errors, I believe the updated lines below are the AFNetworking 2.0 way of doing it with AFHTTPSessionManager:

-(APIClass*)init{
    // call super init
    self = [super init];

    if (self != nil){
        user = nil;
        self.requestSerializer = [AFJSONRequestSerializer serializer];
        self.responseSerializer = [AFJSONResponseSerializer serializer];
    }
}

For your third error, the method multiPartFormRequestWithMethod:path:parameters:constructingBodyWithblock should be replaced with:

[self POST:kAPIPath parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    // attach file if needed
} success:^(NSURLSessionDataTask *task, id responseObject) {
    // handle success
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    // handle failure
}];

Upvotes: 2

Related Questions