2013-02-11 25 views
5

Tôi muốn xem dựa trên NSTableview của tôi để không sử dụng lại TableCellViews được tạo trước đó được cuộn ra khỏi phạm vi. Tôi thấy rằng điều này sẽ có thể với UITableView bằng cách ghi đè dequeueReusableCellWithIdentifier: để trả về nil. Ist có giải pháp tương tự cho NSTableView?Làm thế nào để làm cho NSTableView không tái sử dụng TableCellViews

-

Bối cảnh của tôi: Tôi có một cái nhìn khá phức tạp dựa trên-tableView ràng buộc để ManagedObjects theo cách thông thường (tức là bảng nội dung, -selection và -sortdescriptor đang bị ràng buộc để một arraycontroller và tableCellView-yếu tố liên kết với objectValue).

Bảng có khoảng 20 cột nhưng tối đa 400 hàng. Cuộn thực sự chậm, nhưng thời gian profiling chỉ ra rằng không có nguồn duy nhất của sự chậm chạp tồn tại (lớn nhất duy nhất phương pháp-cuộc gọi mất khoảng 5% thời gian). Sau khi lưu trữ các thuộc tính có nguồn gốc/tùy chỉnh của ManagedObject của tôi mà không cần tăng hiệu năng nhiều, tôi hiện đang cố gắng lưu vào bộ nhớ cache (để tránh việc rebind thường xuyên của tablecellViews khi một khung nhìn đi vào phạm vi).

Điều tôi đang cố gắng hiện tại là không ràng buộc nội dung bảng, nhưng để có được chế độ xem của tôi bằng giao thức NSDatasource. Có trong

-(NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 

tôi muốn trả lại TableCellView nếu được lưu trong bộ nhớ cache. Nếu không tôi tạo một hình mới qua

[self.table makeViewWithIdentifier:... owner:self]; 

Kể từ makeViewWithIdentifier có thể trở lại quan điểm rằng đã được lưu trữ bởi tôi, các bảng nội dung được điều sai lầm với các tế bào sai.

Hiệu suất là tốt hơn đáng kể với cách tiếp cận này ...

-

ý tưởng khác về giúp cuộn performant hơn cũng được appriciated.

+0

Tôi muốn được biết liệu bạn có ở đâu với điều này không. Tôi nghĩ rằng tôi có vấn đề ngược lại trong đó NSTableView của tôi là * không * tái sử dụng các tế bào vì một lý do nào đó. Tôi đã thử PXListView, nhưng có hiệu suất tồi tệ hơn và rất nhiều lỗi, vì vậy tôi muốn gắn bó với NSTableView nhưng làm việc ra làm thế nào để làm cho nó xem bộ nhớ cache mà tôi nghĩ rằng nó phải làm. Theo như vấn đề của bạn đi, bạn sẽ có thể tạo ra một định danh duy nhất cho mỗi lần xem hoặc là sẽ gây ra sử dụng bộ nhớ khủng khiếp? – danpalmer

Trả lời

7

Trong bảng của bạnXem: viewForTableColumn: triển khai đặt .identifier trên chế độ xem được trả về thành không. Điều đó sẽ ngăn chặn các bảng từ bộ nhớ đệm nó. Sau đó, bạn có thể quản lý bộ nhớ cache của riêng mình. FWIW, bạn thậm chí không cần phải sử dụng makeViewWithIdentifier: bạn chỉ có thể tạo các khung nhìn của mình theo cách thủ công từ đầu, thay vì sử dụng phương thức đó (mà tải các khung nhìn thiết lập trước tạo thành NIB).

Tuy nhiên, nếu bạn gặp sự cố về hiệu suất, sẽ tốt hơn nếu giải quyết những vấn đề đó bằng cách xem xét những gì chậm và lý do tại sao. Bạn không cung cấp thông tin về lý do tại sao nó chậm, vì vậy rất khó để nói phải làm gì. 20 cột là rất nhiều. Bạn có thể nhận được hiệu suất tốt hơn bằng cách cố gắng giảm số lượng lớp của mình bằng cách sử dụng canDrawSubviewsIntoLayer, trên NSTableCellView hoặc NSTableRowView. Nhưng có rất nhiều cảnh báo và những điều cần lưu ý khi thực hiện việc này.

corbin

+0

Ngoài ra, giống như trong UIKit và dequeueReusableCellWithIdentifier :, bạn có thể ghi đè lên makeViewWithIdentifier và thực hiện cơ chế bộ nhớ đệm của riêng bạn (hoặc có nó trở về nil). –

+0

Bạn có nói rằng sự trở lại từ tableView: viewForTableColumn: chỉ được sử dụng để lưu vào bộ nhớ đệm nhóm dùng lại?Có bất kỳ thông tin hiện tại nào về số lượt xem sẽ bị chậm lại hay cách để biết hồ bơi sử dụng lại lớn đến mức nào? Bất kỳ cách nào để biết làm thế nào mà có thể gắn vào API xem bỏ qua chế độ xem cuộn? – uchuugaka

+1

Không, đó không phải là những gì tôi nói. Sự trở lại từ tableView: viewForTableColumn: là khung nhìn mà bảng đặt ở vị trí đã cho. Khi bảng đi để loại bỏ khung nhìn (vì nó không còn cần thiết nữa), nó được lưu trữ CHỈ nếu view.identifier là non-nil. Nếu không, khung nhìn sẽ được tung ra và giải phóng. –

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