NSURL делегат didReceiveData метод не вызван - PullRequest
0 голосов
/ 08 февраля 2012

Я знаю, что это обсуждалось во многих других сообщениях, но мне нужно опубликовать это, потому что эти темы не помогли мне, к сожалению.Я пытаюсь подключиться к серверу rails, который возвращает некоторые данные в формате JSON в ответ на запрос GET. Я реализовал четыре метода для NSConnectionDataDelegate, как указано ниже

#pragma mark -
#pragma mark NSURLConnectionDataDelegate

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

    NSLog(@"didReceiveResponse");
    [resultData setLength:0];

}


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

    NSLog(@"didReceiveData");
[resultData appendData:data];


}

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

    NSLog(@"didFailWithError");

    NSString *errDesc = [NSString stringWithFormat:@"Connection failed: %@", [error description]];
    NSLog(@"%@",errDesc);

}

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

    NSLog(@"didReceiveLoading");
}

В методе connectionDidFinishDownloading (не указан)) Я выполняю анализ JSON, но это не удается, поскольку resultData пусто, поскольку метод didReceiveData никогда не вызывается.

Метод didReceiveResponse вызывается, потому что я вижу, что сообщение регистрируется.Сервер работает на локальном хосте, поэтому я могу подтвердить, что запрос получен, и используя Чарльза, я знаю, что ответ получен правильно в формате JSON.Таким образом, на стороне сервера, похоже, нет проблем.Но метод didReceiveData никогда не вызывается.Это не метод didFailWithError.

Может кто-нибудь помочь мне с этим?Я не могу понять, что я делаю неправильно.Это первый раз, когда я работаю с NSURL, поэтому я буду очень признателен.Я работаю на iOS 5 с ARC.

Satyam

Редактировать:

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@?%@", kDevelopmentMode ? kLocalHost : kHost, endpoint, parameters]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Полагаю, ваше приложение не получает данные обратно. Попробуйте это с вашим URL, он даст вам знать, какие необработанные данные возвращены, и jsonserialization, если данные будут возвращены.

NSData *returnedData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://yourURLHere"]];

if (returnedData) {
    NSLog(@"returnedData:%@", returnedData);

    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:returnedData options:kNilOptions error:Nil];
    NSLog(@"jsonDict:%@", jsonDict);
}
else
    NSLog(@"Got Nothing");

если ваш журнал отображает необработанные данные и данные json, то проблема связана с вашим NSURLRequest. Но если в журнале отображается «Ничего не получено», значит, проблема в том, что вы пытаетесь получить.

EDIT

#import <UIKit/UIKit.h>

@interface AsyncImage : UIImageView 
{    
    NSMutableData *activeDownload;
    NSURLConnection *imageConnection;
}
@property (nonatomic, retain) NSMutableData *activeDownload;
@property (nonatomic, retain) NSURLConnection *imageConnection;
- (void)loadImageFromURL:(NSURL*)url;
@end



#import "AsyncImage.h"

@implementation AsyncImage
@synthesize activeDownload;
@synthesize imageConnection;

- (void)dealloc
{
    [super dealloc];
    NSLog(@"dealloc AsyncImage");

    [activeDownload release];
    [imageConnection cancel];
    [imageConnection release];
}

- (void)cancelDownload
{
    [self.imageConnection cancel];
    self.imageConnection = nil;
    self.activeDownload = nil;
}


#pragma mark -
#pragma mark Download support (NSURLConnectionDelegate)

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.activeDownload appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    // Clear the activeDownload property to allow later attempts
    self.activeDownload = nil;

    // Release the connection now that it's finished
    self.imageConnection = nil;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    self.image = [UIImage imageWithData:self.activeDownload];

    self.activeDownload = nil;

    // Release the connection now that it's finished
    self.imageConnection = nil;
}

- (void)loadImageFromURL:(NSURL*)url {
    if (self.imageConnection!=nil) { [imageConnection release]; } //in case we are downloading a 2nd image

    self.activeDownload = [NSMutableData data];
    // alloc+init and start an NSURLConnection; release on completion/failure
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:
                             [NSURLRequest requestWithURL:url] delegate:self];
    self.imageConnection = conn;
    [conn release];
}

@end
0 голосов
/ 16 декабря 2012

Установить NSURLConnectionDelegate в файле .h.

...