0

tableviewcontrollerで大きなパフォーマンスの問題が発生しています。スクロールは非常に遅いです。didSelectRowAtIndexPathメソッドでNSLOGを作成しましたが、これはスクロールするたびに呼び出されることに気付きました。そんなはず?

このテーブルを検索しましたが、データはjsonの応答に依存するため、いくつかのロジックがあります。この方法はここで確認できます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        //NSLog(@" scroll");
        // Configure the cell...
    static NSString *CellIdentifier = @"contactCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    UILabel *nameLabel = (UILabel *)[cell viewWithTag:1];
    UILabel *workPlaceLabel = (UILabel *)[cell viewWithTag:2];

    if(searching)
    {
            //NSLog(@" copyListOfItems: %@",copyListOfItems);
        NSString*lastName=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"]objectForKey:@"lastname"];
        if(lastName==nil)
        {
            lastName=@" ";
        }
        NSString*firstName=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"]objectForKey:@"firstname"];
        if(firstName==nil)
        {
            NSArray*phonesArray=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"]objectForKey:@"phone"];
            NSLog(@"NUMERO TELEFONE %d",[phonesArray count]);

            if([phonesArray count]>0)
            {
                NSString*phoneNumber=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Phone"];
                nameLabel.text=phoneNumber;
            }else{
                nameLabel.text=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Current"];
                workPlaceLabel.text=@"";
            }

        }else{
            NSString *stringName= [NSString stringWithFormat:@"%@ %@", firstName, lastName];
            nameLabel.text=stringName;
            workPlaceLabel.text=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Current"];
        }
    }
    else {
            //NSLog(@" _contactsArray: %@",_contactsArray);
        NSString*lastName=[[[_contactsArray objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Lastname"];
        if(lastName==nil)
        {
            lastName=@" ";
        }
        NSString*firstName=[[[_contactsArray objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Firstname"];
        if(firstName==nil)
        {
            NSArray*phonesArray=[[[_contactsArray objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Phone"];
                //NSLog(@"NUMERO TELEFONE %d",[phonesArray count]);

            if([phonesArray count]>0)
            {
                NSString*phoneNumber=[[[[_contactsArray objectAtIndex:indexPath.row]objectForKey:@"phone"] objectAtIndex:0]objectForKey:@"phonenumber"];
                nameLabel.text=phoneNumber;
            }else{
                nameLabel.text=[[[_contactsArray objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Current"];
                workPlaceLabel.text=@"";
            }
        }else{
            NSString *stringName= [NSString stringWithFormat:@"%@ %@", firstName, lastName];
            nameLabel.text=stringName;
           if([[[_contactsArray objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Current"])
            {
            workPlaceLabel.text=[[[_contactsArray objectAtIndex:indexPath.row]objectForKey:@"Contact"] objectForKey:@"Current"];

        }
        }
    }
        // Configure the cell...
    return cell;
}
4

2 に答える 2

2

これには、コードから削除できる不要な呼び出しがたくさんあります。繰り返される連絡先を取得するためのこれらの呼び出しはすべて、一度行うことができるときに実行するのに時間がかかります。ifステートメントの最初のブランチと同様に、次のような呼び出しがあります。

NSString*lastName=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"]objectForKey:@"lastname"];
NSString*firstName=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"]objectForKey:@"firstname"];
NSArray*phonesArray=[[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"]objectForKey:@"phone"];

次のような操作を行うことで、これらの呼び出しを圧縮できます。

id contact = [[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"];
NSString *lastName=[contact objectForKey:@"lastname"];
NSString *firstName=[contact objectForKey:@"firstname"];
NSArray *phonesArray=[contact objectForKey:@"phone"];

ただし、理想的には、これらのアイテムをプロパティとして持つ独自のクラスがあるため、次のようなことができます。

Contact *contact = (Contact *)[[copyListOfItems objectAtIndex:indexPath.row]objectForKey:@"Contact"];
NSString *lastName = contact.lastName;
NSString *firstName = contact.firstName;
NSArray *phonesArray = contact.phone;

編集:非同期画像読み込みを行う方法

これは、過去にプレースホルダー画像を使用して画像の非同期読み込みを行った方法です。私が使用していたセルは、私が作成したカスタムクラスでしたが、それを実行する方法がわかるはずです。

// Setup the image view
UIImageView* imageView = cell.imageView;
imageView.image = [UIImage imageNamed:@"Loading.png"];

// Load the image asynchronously
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
    // Here you will want to make a call to your web server to get the image
    // and store it in a UIImage named image
    UIImage *image = // your code to get the image from the server

    // Only update if the cell is still on the screen
    if ([[tableView indexPathsForVisibleRows] containsObject:indexPath]) {
        // Have to update UI elements on the main thread
        dispatch_sync(dispatch_get_main_queue(), ^{
            [[cell imageView] setImage:image];
            [cell setNeedsLayout];
        });
    }
});
于 2012-10-25T12:06:21.687 に答える
1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

表示されるすべてのセルに対して呼び出されるため、ユーザーがスクロールしているときにロジックが複数回呼び出されるため、このループの外に配列を設定して、このループの値を置き換えることができます。方法

于 2012-10-25T10:14:59.350 に答える