views:

263

answers:

2

Hi guys..

So i'm very new to this iphone development stuff.... and i'm stuck.

I'm building an app that connects to the twitter api. However when the connectionDidFinishLoading method gets called, it doesn't seem to recognise the delegate.

Here's the source code of the request class:

#import "OnePageRequest.h"


@implementation OnePageRequest

@synthesize username;
@synthesize password;
@synthesize receivedData;
@synthesize delegate;
@synthesize callback;
@synthesize errorCallBack;
@synthesize contactsArray;

-(void)friends_timeline:(id)requestDelegate requestSelector:(SEL)requestSelector{
    //set the delegate and selector
    self.delegate = requestDelegate;
    self.callback = requestSelector;

    //Set up the URL of the request to send to twitter!!
    NSURL *url = [NSURL URLWithString:@"http://twitter.com/statuses/friends_timeline.xml"];

    [self request:url];
}

-(void)request:(NSURL *) url{

    theRequest = [[NSMutableURLRequest alloc] initWithURL:url];
    theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    if (theConnection){
        //Create the MSMutableData that will hold the received data.
        //receivedData is declared as a method instance elsewhere
        receivedData=[[NSMutableData data] retain];
    }else{
        //errorMessage.text = @"Error connecting to twitter!!";
    }
}

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{

    if ([challenge previousFailureCount] == 0){
        NSLog(@"username: %@ ",[self username]);
        NSLog(@"password: %@ ",[self password]);
        NSURLCredential *newCredential = [NSURLCredential credentialWithUser:[self username]
                                                                    password:[self password]
                                                                 persistence:NSURLCredentialPersistenceNone];
        [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
    } else {
        [[challenge sender] cancelAuthenticationChallenge:challenge];
        NSLog(@"Invalid Username or password!");
    }
}   

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    [receivedData setLength:0];

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    [receivedData appendData:data];

}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

    [theConnection release];
    [receivedData release];
    [theRequest release];

    NSLog(@"Connection failed. Error: %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);

    if(errorCallBack){
        [delegate performSelector:errorCallBack withObject:error];
    }
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{

    if (delegate && callback){
        if([delegate respondsToSelector:[self callback]]){
            [delegate performSelector:[self callback] withObject:receivedData];
        }else{
            NSLog(@"No response from delegate!");
        }
    }
    [theConnection release];
    [theRequest release];
    [receivedData release];
}

Here's the .h:

@interface OnePageRequest : NSObject {

    NSString *username;
    NSString *password;
    NSMutableData *receivedData;
    NSURLRequest *theRequest;
    NSURLConnection *theConnection;
    id  delegate;
    SEL callback;
    SEL errorCallBack;
    NSMutableArray *contactsArray;
}

@property (nonatomic,retain) NSString *username;
@property (nonatomic,retain) NSString *password;
@property (nonatomic,retain) NSMutableData *receivedData;
@property (nonatomic,retain) id delegate;
@property (nonatomic) SEL   callback;
@property (nonatomic) SEL   errorCallBack;
@property (nonatomic,retain) NSMutableArray *contactsArray;

-(void)friends_timeline:(id)requestDelegate requestSelector:(SEL)requestSelector;
-(void)request:(NSURL *) url;

@end

In the method: connectionDidFinishLoading, the following never gets executed: [delegate performSelector:[self callback] withObject:receivedData];

Instead I get the message: "No response from delegate"

Anyone see what I'm doing wrong?! or what might be causing the problem?

Regards, Fiona

A: 
[delegate performSelector:[self callback] withObject:receivedData];

(Sorry, my comment about the SEL arguments was due to the difficulty reading the code pasted into the question.)

using the debugger in connectionDidFinishLoading: can you verify that the delegate and callback variables are not nil?


callback is retrieved it has the value: friends_timeline_callback, which is what i'd expect

Next step is to verify that the selector is actually correct. i.e. if the callback method has an argument it should be @selector(friends_timeline_callback:) (note the trailing : character to specify that an argument is part of the method signature)

ohhorob
Hi ohhorob.. when debugging, the following statement:if([delegate respondsToSelector:[self callback]]) before being executed: callback is out of scope... however when this statement is executed and the value of callback is retrieved it has the value: friends_timeline_callback, which is what i'd expect.
Fiona
A: 

The syntax looks a little wrong. Try:

if([delegate respondsToSelector:@selector(callback)]){

and if the callback method accepts an arguement you'll need to add a colon i.e:

if([delegate respondsToSelector:@selector(callback:)]){
Aaron
her `[self callback]` returns a `SEL` as required. the trailing colon is where I think the problem is, however her listed code doesn't show the `@selector()` usage that assigns it
ohhorob