2013-06-10 3 views
1

Я не могу заставить методы делегата звонить, когда загружаю представление, связанное с этим классом .. ни один из них не срабатывает. Я уверен, что это то, что я забыл, но не могу, чтобы жизнь меня определяла, почему.Как вы можете вызвать методы делегирования NSURLConnection?

DownloadUpdates.h

#import <UIKit/UIKit.h> 

@interface DownloadUpdates : UIViewController 

    @property (strong, nonatomic) NSMutableData *responseData; 
    @property (strong, nonatomic) NSURLConnection *connection; 

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

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

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

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

@end 

DownloadUpdates.m

URL-адрес был удален в целях обеспечения конфиденциальности, но это только делает вызов к API, который будет возвращать данные в формате JSON. Этот URL-адрес функционирует так, как ожидалось, поэтому это проблема с кодом.

#import "DownloadUpdates.h" 

@interface DownloadUpdates() 

@end 

@implementation DownloadUpdates 

- (void)connection:(NSURLConnection *)_connection didReceiveResponse:(NSURLResponse *)response 
{ 
    _responseData = [[NSMutableData alloc] init]; 
    NSLog(@"Response received"); 
} 

- (void)connection:(NSURLConnection *)_connection didReceiveData:(NSData *)data 
{ 
    [_responseData appendData:data]; 
     NSLog(@"Data received"); 
} 

- (void)connection:(NSURLConnection *)_connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"Unable to fetch data"); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)_connection 
{ 
    NSLog(@"Succeeded! Received %d bytes of data",[_responseData 
                length]); 
// NSString *txt = [[NSString alloc] initWithData:_responseData encoding: NSASCIIStringEncoding]; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSURL *myURL = [NSURL URLWithString:@"URL HERE"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 

    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    // Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

Я буду благодарен за любую помощь/совет, который вы можете предложить.

+3

Хотя это не требуется, вы никогда не объявляете свой класс совместимым с любым протоколом NSURLConnection. –

+0

Это может показаться очевидным, но я видел некоторые странные вещи на SO. Вы действительно установили объект этого класса в качестве делегата соединения? – Abizern

+0

Это мой первый раз, используя NSURLConnection. Я не уверен, что вы имеете в виду. (Я не делал этого очень долго). –

ответ

2

Используйте свойства, чтобы применить сильный модификатор:

self.responsedata = [[NSMutableData alloc] init]; 
(.....) 
self.connection = [[NSURLConnection alloc] initWithRequest: ....etc... 
+0

Это лучшая форма, но я не вижу, как она решает проблему. – danh

+0

@danh: Как только 'viewDidLoad' заканчивается, метод соединения выходит из области действия и освобождается. Твердо придерживаясь этого, он останется вокруг и вызовет методы делегата. –

+0

Вы правы, до ARC, но свойство объявлено сильным. И хотя лучше использовать синтезированный сеттер, ARC будет вставлять в любое место, где вы напрямую обращаетесь к свойству. Ваш ответ был хорошим один пару лет назад, но не больше. – danh

0

Я предложил бы положить в NSLog или контрольную точку в viewDidLoad, чтобы убедиться, что это вызывался на всех. Например, это может произойти, если вы пренебрегли заданием DownloadUpdates в качестве класса для сцены вашей раскадровки.