Сбой подключения, зависает графический интерфейс tableview

#iphone #ios4

#iPhone #ios4

Вопрос:

Я показываю изображения в tableview, используя метод NSData dataWithContentsOfURL, но при прокрутке графический интерфейс tableview зависает.итак, после поиска по форуму я обнаружил, что могу попробовать использовать метод NSURLConnection. итак, я пытался, но не могу успешно реализовать это.

Пожалуйста, найдите мой код ниже…

пожалуйста, помогите мне, как я могу правильно это сделать..

 // Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"DataIdentifier"]  autorelease];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.backgroundColor = [UIColor colorWithRed:230.0/255.0 green:249.0/255.0 blue:230.0/255.0 alpha:2.0];

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        profileName = [appDelegate.arrCommunityUserList objectAtIndex:indexPath.row];

        NSString *imgName = [profileName.user_image stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

        NSString *strValue = [NSString stringWithFormat:@"%d", profileName.userID];

        if (tableView == myTableView)
        {
            cellRectangle = CGRectMake(15, 2, 75, 75 );

            NSString *myurl = [NSString stringWithFormat: @"%@pics/photos/%@/%@",ConstantImgURL, strValue,imgName];

            NSURL *url = [NSURL URLWithString: myurl];

            imageView = [[UIImageView alloc] initWithFrame: cellRectangle];

            NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:myurl]];
            [NSURLConnection connectionWithRequest:request delegate:self];

            // create the connection with the request
            // and start loading the data
            NSURLConnection *theConnection =[[NSURLConnection alloc] initWithRequest:
                                             request delegate:self];

            if (theConnection) 
            {
                receivedData = [[NSMutableData data] retain];

            } 

            [cell.contentView addSubview:imageView];

        }


    }

return cell;    
}

// did receive response
- ( void )connection:( NSURLConnection * )connection didReceiveResponse:( NSURLResponse * )response 
//--------------------------------------------------------------------------------------------------
{  
    NSLog(@"Received response: %@", response);
}

// get recieved data
- ( void )connection:( NSURLConnection * )connection didReceiveData:( NSData * )data 
//----------------------------------------------------------------------------------
{  
    //  NSLog(@"Connection received data, retain count: %d", [connection retainCount]);

    [receivedData appendData:data]; 

}  

// finished loading 
- ( void )connectionDidFinishLoading:( NSURLConnection * )connection 
//-------------------------------------------------------------------
{  
    // Set appIcon and clear temporary data/image
    UIImage *image = [[UIImage alloc] initWithData:receivedData];
    imageView.image = image;



}  

// connection failed with error
- ( void )connection:( NSURLConnection * )connection didFailWithError:( NSError * )connError 
//---------------------------------------------------------------------------------------
{
    //  NSLog(@"Error receiving response: %@", connError);
    [connection release];
    [receivedData release];
}
  

Комментарии:

1. Кстати: сохранение количества бесполезно. Не вызывайте это.

Ответ №1:

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

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

Вместо этого вам следует либо загружать все изображения асинхронно, когда запрашивается tableView . Вот хороший пример, который использует теги для идентификации их по мере их возврата. Это непросто во всем контексте того, что вы делаете; поэтому, возможно, вы захотите запустить все NSURLConnections при tableView отображении, возвращать 0 for numberOfSectionsInTableView до завершения подключений, затем вызвать reloadData tableView , когда все они будут завершены (и заставить numberOfSectionsInTableView теперь возвращать нужное количество строк для отображения).

Ответ №2:

Начните использовать библиотеку ASI:http://allseeing-i.com/ASIHTTPRequest/How-to-use Чем скорее, тем лучше.

Ответ №3:

Я думаю, это может решить вашу проблему …http://www.markj.net/iphone-asynchronous-table-image