NSData возвращает 0 байтов - PullRequest
2 голосов
/ 01 апреля 2012

Я пытаюсь загрузить изображение следующим образом. Но когда я вызываю мою loadImageFromURL:(NSURL*)inURL функцию как [self loadImagesFromURL:url] в моем tableView, она показывает 0 байтов. Как получить значение (delta)NSData в моем tableview ?, которое объявлено как глобальное ...

NSURLConnection* connection;
NSMutableData* delta;

- (void)loadImageFromURL:(NSURL*)inURL {
    NSURLRequest *request = [NSURLRequest requestWithURL:inURL];
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];

    if (conn) {
        delta = [[NSMutableData data] retain];
    }    
}

- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data {
    [delta appendData:data];

    }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     
    NSURL *urlink=[NSURL URLWithString:[[objectsForImages objectForKey:[arrayOfCharacters objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]];
    [self loadImageFromURL:urlink];
    UIImage *imageForAz=[UIImage imageWithData:delta];
    cell.imageView.image=imageForAz; 

}

1 Ответ

5 голосов
/ 01 апреля 2012

Вас смущает асинхронность.Если бы loadImageFromURL: были синхронными, например, обертка sendSynchronousRequest:returningResponse:error:, ваш код работал бы так, как вы ожидаете;loadImageFromURL: будет блокироваться во время выборки и будет возвращаться при заполнении delta.

Однако все это асинхронно, так что вам действительно нужно реализовать connectionDidFinishLoading: в вашем делегате (что в данном случаеэто self), и он должен установить cell.imageView.image там.

Переписав часть вашего кода соответствующим образом (я предполагаю, что вы удалили посторонний код в tableView:cellForRowAtIndexPath: для целей этого примера):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     
    NSURL *urlink=[NSURL URLWithString:[[objectsForImages objectForKey:[arrayOfCharacters objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]];
    [self loadImageFromURL:urlink];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    UIImage *imageForAz=[UIImage imageWithData:delta];
    cell.imageView.image=imageForAz;
}

Ознакомьтесь с Руководством по программированию системы загрузки URL на NSURLConnection для получения более подробной информации / примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...