2012-05-06 24 views
10

chúng tôi không nói hàng ngàn hàng hoặc bất cứ điều gì, mặc dù nếu có một cách để làm cho mọi thứ quy mô lên cao, tôi rất thích nó.làm động một số lượng lớn các hàng/phần trong UITableView hiệu suất kém

Tôi có một bảng với 27 phần và 180 hàng trải rộng trên tất cả các phần và kịch bản tôi đang gặp khó khăn là khi tôi tạo ảnh động cho trạng thái mô hình chỉ với 3 phần và 5 hàng và (thậm chí tệ hơn) quay lại lần nữa.

Tôi đang ghép tất cả các hoạt ảnh với beginUpdates/endUpdates. Ứng dụng của tôi khá tốt bị khóa trong 1-2 giây trên iphone4 trong khi nó tìm ra mọi thứ, sau đó hoạt ảnh bắt đầu.

Tôi đã thử cả hai làm động việc xóa/thêm mỗi hàng, giữ các phần xung quanh (và giảm số lượng hàng của chúng xuống 0 trong trường hợp xóa) và cũng chỉ làm động việc xóa/chèn các phần của chúng (khi nào số hàng sẽ giảm xuống 0). Tôi đã cho rằng cái sau sẽ cho hiệu suất tốt hơn nhưng nó không thay đổi mọi thứ.

Có điều gì có thể được thực hiện vào cuối ứng dụng để tăng tốc độ này không? Hiện tại, tôi có một đoạn mã khá thô lỗ để giải cứu các hoạt ảnh riêng lẻ nếu có hơn 20 hình ảnh, thay vào đó, chỉ chọn tải lại dữ liệu.

chỉnh sửa đây là mã hiển thị sự cố. Hiệu suất của mã này hơi tốt hơn so với mã monotouch tương đương (đó là những gì tôi đã sử dụng trước đây), nhưng nó vẫn còn khá xấu.

#import "TableViewController.h" 

@interface MyTableViewDataSource : NSObject<UITableViewDataSource> { 
    int rows; 
}; 

@end 

@implementation MyTableViewDataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (void)setRowCount:(int)r 
{ 
    rows = r; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return rows; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    cell.textLabel.text = [NSString stringWithFormat:@"row %d", indexPath.row]; 

    return cell; 
} 

@end 

@implementation MyTableViewController { 
    UIBarButtonItem *populateButtonItem; 
}; 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     populateButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Populate" style:UIBarButtonItemStylePlain target:self action:@selector(populateDataSource)]; 
    } 
    return self; 
} 

- (void)populateDataSource 
{ 
    NSMutableArray* new_rows = [[NSMutableArray alloc] init]; 
    [((MyTableViewDataSource*)self.tableView.dataSource) setRowCount:200]; 

    for (int i = 0; i < 200; i ++) 
     [new_rows addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 

    [self.tableView beginUpdates]; 
    [self.tableView insertRowsAtIndexPaths:new_rows withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [self.tableView endUpdates]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tableView.dataSource = [[MyTableViewDataSource alloc] init]; 
    self.navigationItem.rightBarButtonItem = populateButtonItem; 
} 

@end 
+1

Dự đoán đầu tiên của tôi là các ô bảng của bạn là thủ phạm. Bạn đang sử dụng các ô tùy chỉnh? – lyricsboy

+0

Bạn có thể đăng một số mã không? Ngoài ra: UITableViewCells của bạn có bị mờ không? – Ahti

+1

Dụng cụ chỉ báo là nút cổ chai của bạn? Bạn đang xóa chúng với một deleteRowsAtIndexPaths duy nhất: ... cuộc gọi, hoặc nhiều cuộc gọi cá nhân? Bạn đang gọi reloadData ở giữa các hình ảnh động (bạn không bao giờ phải làm điều đó)? –

Trả lời

3

Nó chỉ có ý nghĩa để tạo hiệu ứng cho các hàng hiển thị. Thay vì thực hiện hoạt ảnh cho tất cả các hàng bạn đang chèn, hãy xem xét chỉ tạo hoạt ảnh khi chèn các hàng đó sẽ hiển thị.

Ngoài ra, bạn có chắc chắn rằng đó là hoạt ảnh gây ra sự chậm trễ? Bạn có nhận được sự chậm trễ tương tự nếu bạn vượt qua UITableViewRowAnimationNone cho hoạt ảnh hay không nhanh hơn? Nếu nó nhanh hơn, sau đó một lần nữa, tránh làm hoạt hình những chèn mà sẽ không được hiển thị.(Bạn có thể tìm ra các hàng hiện có thể nhìn thấy bằng cách sử dụng -indexPathsForVisibleRows.) Nếu nó không nhanh hơn, thì vấn đề có lẽ không liên quan đến hoạt ảnh, mà là chi phí chèn hàng trăm hàng cùng một lúc. Nạp lại toàn bộ bảng như bạn đang làm là một lựa chọn; chèn các hàng trong các lô nhỏ hơn là một hàng khác.

Cuối cùng, bạn nên lập hồ sơ ứng dụng của mình bằng Công cụ trong khi bạn thực hiện thao tác chèn. Bạn sẽ có ý tưởng tốt hơn về những gì ứng dụng đang làm trong thời gian chậm trễ đó và đó là bước đầu tiên hướng tới loại bỏ sự chậm trễ.

+0

tránh làm sinh động các hàng sẽ không hiển thị thực sự là những gì tôi muốn làm. Nhưng nó không có vẻ như indexPathsForVisibleRows sẽ cho tôi những gì tôi muốn - hoạt hình có khả năng sẽ được lấp đầy trong khu vực hiển thị, do đó, các hàng hiện tại không phải là những thứ tôi muốn tạo hiệu ứng ... trừ khi indexPathsForVisibleRows bằng cách nào đó tính đến các hàng (và/hoặc phần) tôi sẽ thêm/xóa. – toshok

+0

... có nghĩa là chuyển sang UITableViewRowAnimationNone là vé. Vẫn còn rất ít tạm dừng ban đầu, hầu như không đáng chú ý. Vì vậy, có lẽ nó không phải là quá nhiều số lượng hình động, nhưng có lẽ là z-thứ tự (hoặc cắt?) Mà UITableView đang làm khi đi qua trong các thành viên enum khác đã gây ra sự chậm lại – toshok

0

Hãy thử kiểm tra cùng chức năng với một số chuỗi mã vạch cứng và thấy sự cố đã biến mất. Nếu vấn đề vẫn còn đó, nó có nghĩa là vấn đề là với rendering không với dữ liệu.

Đối với các loại hoạt ảnh khác nhau, có một số điều khiển tùy chỉnh đã được thực hiện, nơi bạn có thể có hoạt ảnh nhanh hơn với một số lớp lót đẹp: Here.

1

Bạn đang sử dụng UITableViewRowAnimationAutomatic (Tham khảo: Chế độ xem bảng chọn kiểu hoạt ảnh thích hợp cho bạn. (Được giới thiệu trong iOS 5.0.)) Và vì lý do nào đó, chế độ xem bảng chọn một chế độ xem thực sự xấu. hàng trong khi mở rộng chúng. Thay đổi độ mờ trên 200 UIViews trong khi thay đổi kích thước khung của chúng và di chuyển chúng xung quanh HAS để chậm. :)

Bạn chỉ có thể làm điều này:

[self.tableView insertRowsAtIndexPaths:new_rows withRowAnimation:UITableViewRowAnimationNone]; 

này sẽ làm giảm hình ảnh động để hình ảnh động rất cơ bản UITableView khi chèn hàng, trong đó, theo ý kiến ​​của tôi, là hoàn toàn đủ khi chèn nhiều.

+0

yup, đó thực sự là mẹo. – toshok

Các vấn đề liên quan