NSURLConnection, GUI табличного представления зависает - PullRequest
0 голосов
/ 09 мая 2011

Я показываю изображения в табличном представлении с помощью метода NSData dataWithContentsOfURL, но когда я прокручиваю графический интерфейс табличного представления, зависает. Поэтому после поиска по форуму я обнаружил, что могу попробовать с помощью метода 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];
}

Ответы [ 3 ]

3 голосов
/ 09 мая 2011

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

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

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

0 голосов
/ 26 мая 2011

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

0 голосов
/ 09 мая 2011

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

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