2012-06-23 21 views
6

Tôi đã cố gắng giải quyết một bí ẩn trong vài ngày qua về lý do tại sao NSFetchedResultsController của tôi với kích thước lô 20 sẽ luôn luôn bị lỗi (tức là, tải vào bộ nhớ) tất cả các đối tượng của tôi ngay lập tức khi quá trình tìm nạp hoàn tất, khiến yêu cầu mất ~ 20 giây.Chiều cao UITableView động với các đối tượng dữ liệu lõi

Nó chỉ ra rằng vì trong heightForRowAtIndexPath của tôi, chiều cao được dựa trên độ dài của thuộc tính NSString của từng đối tượng được tìm nạp, và sau đó tải lại bảng, nếu bảng có 2000 hàng, thì chiều cao được tính toán cho mỗi hàng trong đầu, và kể từ khi tôi truy cập một tài sản văn bản của đối tượng, nó sẽ lỗi trong năm 2000 đối tượng (trong 20 kích thước lô) ngay trong đầu, gây ra nó để có mãi mãi. (Tôi không biết chiều cao hàng được tính toán ngay từ đầu). Vì vậy, câu hỏi đặt ra là, nếu tôi có bộ điều khiển kết quả tìm nạp có kích thước lô là 20, nhưng chiều cao hàng của tôi dựa trên thuộc tính văn bản của đối tượng, nếu tôi cố truy cập sẽ khiến đối tượng không bị một lỗi nữa nhưng thực sự được nạp vào bộ nhớ, điều gì sẽ là một giải pháp để tính toán chiều cao?

Tùy chọn của tôi là gì?

+0

Điều gì sẽ xảy ra nếu bạn kiểm tra xem đối tượng có phải là lỗi hay không, nếu có, trả về kích thước tùy ý, nếu không hãy lấy chuỗi và tính toán? Liệu các phương pháp được gọi lại khi tế bào đi vào để xem? Tôi chỉ đoán ở đây. Điều đó hoặc thực hiện một tải lười biếng (I.e hàng mới được thêm vào khi bạn cuộn) dường như là lựa chọn duy nhất của bạn. – jrturton

+0

Không có heightForRow chỉ được gọi khi bắt đầu tải lại và không được gọi mỗi lần một ô xuất hiện (như cellForRow). Đó là những gì tôi đã suy nghĩ quá, nhưng tôi không nghĩ rằng nó sẽ làm việc .. – Snowman

+0

Nghĩ rằng nó nghe quá dễ dàng. – jrturton

Trả lời

2

Câu hỏi thú vị. Những gì tôi sẽ làm để tăng hiệu suất sẽ là tạo một thuộc tính trong mô hình của bạn để lưu trữ độ dài cho văn bản chuỗi đó. Bằng cách này, bạn không cần phải tính toán chiều dài cho mỗi hàng trên bay nhưng bạn có chiều cao được tính toán trước.

Myabe có thể là các giải pháp có giá trị khác.

+0

Nhưng tôi vẫn cần phải truy cập tài sản số nguyên đó, điều này sẽ khiến cho đối tượng không còn là lỗi nữa và được nạp vào bộ nhớ .. – Snowman

+1

@mohabitar Nó không hoàn toàn đúng. Nếu bạn tìm nạp trước thuộc tính đó vào yêu cầu tìm nạp của bạn và sau đó bạn truy cập nó, văn bản chuỗi không được nạp trong bộ nhớ cho đến khi bạn sẽ yêu cầu, nếu không thuộc tính văn bản sẽ vẫn là lỗi. –

+0

Phải, nhưng khi tôi truy cập thuộc tính chuỗi, đối tượng đang giữ chuỗi được nạp vào bộ nhớ (vì đó là lỗi trước đó, không được phục hồi.) – Snowman

-1

Tạo phương pháp tĩnh trong lớp trình điều khiển chế độ xem của bạn chịu trách nhiệm tính toán chiều cao đã nêu. Tất cả những gì bạn cần để cung cấp chức năng này là một NSString và nó sẽ trả về một CGFloat được tính toán dễ dàng. Sử dụng phương pháp này để trả về chiều cao cần thiết của các phần tử của bạn mà không tạo ra chúng (tất cả những gì bạn cần ở đây là siêu dữ liệu của văn bản của chúng).

+0

Phải, nhưng làm thế nào để phương pháp biết NSString là gì mà không cần instantiating các đối tượng? NSString là một thuộc tính của đối tượng, và nếu đối tượng là một lỗi, gọi object.textProperty khiến đối tượng được nạp vào bộ nhớ .. – Snowman

+0

Vấn đề này liên quan đến việc triển khai của bạn. Có lẽ một workaround để có được những dây mà không cần xây dựng trường hợp? Đó là gà và trứng :) – Stavash

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