NSURLConnection работает только один раз - PullRequest
0 голосов
/ 14 октября 2011

Я уже некоторое время работаю над своим первым приложением, но мне кажется, что здесь что-то не хватает. Код ниже был первоначально только в моем делегате приложения; Я просто добавил кнопку обновления в первый контроллер представления, чтобы обновить данные, используемые приложением, поэтому моей первой идеей было снова вызвать код делегата приложения внутри контроллера представления, но методы делегирования NSURLConnection не сработали. Теперь я добавил код в контроллер представления (и также сохранил его в делегате приложения), и методы делегата срабатывают при нажатии кнопки обновления, но responseData равно нулю, refreshString пусто и JSONValue выбрасывает Ошибка «Неожиданный конец ввода» (поскольку ничего не вводится) в журнале (приложение все еще запускается и очищает UITableView, это правильное поведение, поскольку массив теперь пуст). Набор символов данных JSON: UTF-8

Возможно, для этого кода есть лучшее место, где его можно хранить в одном месте и запускать по мере необходимости, и если есть какие-либо предложения, касающиеся этого, я бы тоже их оценил, но моя главная задача - выяснить, почему этот код работает правильно в первый раз, но не работает во второй.

- (void) refreshData{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://beersandears.net/beer-list-json.php?native=yes"]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
    NSLog(@"loadData complete");
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
    NSLog(@"Response received");
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [connection release];
    //label.text = [NSString stringWithFormat:@"Connection failed %@", [error description]];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];
    connection = nil;
    NSString *refreshString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    [responseData release];

    NSDictionary *results = [refreshString JSONValue];

    BeerListAppDataObject* theDataObject = [self beerListAppDataObject]; 

    [theDataObject.beerList removeAllObjects];
    [theDataObject.mapList removeAllObjects];
    [theDataObject.blogList removeAllObjects];

    theDataObject.beerList = [results objectForKey:@"beer"];
    theDataObject.mapList = [results objectForKey:@"map"];
    theDataObject.blogList = [results objectForKey:@"blog"];

    NSLog(@"Data Loaded");

    [self.tableView reloadData];
}

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Вы освобождаете переменную-член responseData NSData в finLoading:

[responseData release];

Но я не вижу ничего другого, заставляющего другой объект NSData добавляться.

В этом примере кода здесь:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

когда они снова запускают соединение (в вашем refreshMethod), они делают:

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}

Ключевой строкой является то, где они получают объект NSMutabaleData и сохраняют его.

receivedData = [[NSMutableData data] retain];
1 голос
/ 14 октября 2011

Просто предположение: попробуйте проверить, что переменная responseData NSMutableData правильно инициализирована в контроллере представления.

Даже если это решит непосредственную проблему, было бы хорошо абстрагировать этот код в его собственный класс (возможно, класс "BeerAPIClient"), чтобы он не существовал в двух местах. Таким образом, его легче поддерживать по мере роста и изменения, потому что есть только одно место для обновления.

...