IOS 5.0 - NSURLConnection работает, но возвращает Null до завершения - PullRequest
3 голосов
/ 12 февраля 2012

У меня есть файл класса, называемый функциями, где я храню повторяющиеся задачи. Одна из функций называется GetPrice, которая подключается к веб-службе XML, анализирует XML и возвращает объект CarPrice. Все прекрасно работает, пока не пришло время вернуть объект CarPrice. Это NULL, хотя в моем connectionDidFinishLoading объект не равен NULL.

Вот моя функция GetPrice:

-(CarPrice*)GetPrice:(NSString *)m
{
    NSString *url =[@"http://myUrl.com"];

    dataWebService = [NSMutableData data];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: url]];
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    [conn start];
    return mp;  //mp is declared as a CarPrice in the @interface section of my funcs class

    //when it gets returned here it is NULL even though....(see below)
}


//Connection Functions=======================


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

    [dataWebService setLength:0];
}

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

    [dataWebService appendData:data];
}

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

    NSString *responseString = [[NSString alloc] initWithData:dataWebService encoding:NSUTF8StringEncoding];
    ParserMetal *pmr = [ParserMetal alloc];
    mp = [pmr parseMetal:responseString];
    //at this point, the mp is fully populated
    //an NSLOG(@"%@", mp.displayPrice); here will show that the mp object is populated
    //however as stated above, when it returns, it is null.
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"Error during Connection: %@", [error description]);
}

//End Connection Functions ==================

Происходит ли return mp; до того, как мп заполняется? Нужно ли здесь использовать синхронное соединение, чтобы убедиться, что данные заполнены до возврата?

1 Ответ

2 голосов
/ 12 февраля 2012

Если я правильно понимаю ваш код, вы позвоните GetPrice:m: и затем начнете соединение оттуда. После запуска соединения с помощью [connection start] вы немедленно возвращаете mp.

Это означает, что соединение установлено, но до того, как оно получит все свои данные, вы уже вернете mp. Вам следует дождаться получения данных, а затем вернуть mp.

Вы можете использовать для этого метод Synchronous или реализовать метод в своем основном классе, который будет вызываться из метода connectionDidFinishLoading:connection:, определенного в вашем «другом файле класса». Как это:

  • Начать соединение
  • Получение данных ...
  • Звоните [mainClass didReceiveAllData:mp]

Надеюсь, это поможет.

...