2012-08-04 31 views
5

Tôi đang sử dụng dữ liệu lõi, NSFetchedResultsController UITableView, với thuộc tính NSDate thoáng qua. Lý do chính tôi có điều này như là một thuộc tính tạm thời là vì vậy các mục nhập UITableView của tôi được đưa vào các phần dựa trên NSDate, nhưng có thể di chuyển giữa các phần khi ngày thay đổi.iOS - Làm cách nào để cập nhật/cập nhật thuộc tính tạm thời của Dữ liệu lõi?

Cho đến nay có vẻ như nó hoạt động rất tốt, nhưng nó chỉ cập nhật/làm mới (tôi thực sự mới với điều này, vì vậy tôi không biết nếu tôi đang sử dụng thuật ngữ chính xác, xin lỗi!) Khi tôi đóng ứng dụng và tiêu diệt nó từ đa nhiệm hoặc chạy lại thông qua Xcode. Nếu tôi không làm điều đó, các mục không thay đổi và không được đưa vào phần chính xác của chúng. Có cách nào để tự làm cho nó làm mới để người dùng không cần phải làm điều đó để làm cho nó chạy đúng không?

Cảm ơn bạn!

+0

Bản cập nhật được truyền bá như thế nào? NSFetchedResultsController delegate? – Mundi

+0

Vâng, tôi nghĩ vậy. – mhbdr

+1

Nó có thể có liên quan với một cửa hàng SQlite bạn không thể sử dụng các thuộc tính tạm thời cho các bộ mô tả sắp xếp. –

Trả lời

3

Thuộc tính tạm thời được làm mới khi bạn gửi refreshObject:mergeChanges: cho đối tượng của mình.

Giải pháp được cung cấp bởi Mundi để áp dụng cơ chế quan sát giá trị khóa có thể hoạt động và nếu có, nó chắc chắn thuận tiện hơn nhiều so với làm mới một cách rõ ràng.

+0

Hey svena, cảm ơn bạn đã trả lời. Tôi sẽ đặt refreshObject: mergeChanges ở đâu? Nó sẽ ở bên trong một hành động? Cảm ơn! – mhbdr

+0

Bạn có thể làm mới đối tượng tại các điểm mà bạn biết ngày được thay đổi. Tuy nhiên, tôi khuyến khích bạn sử dụng cách tiếp cận Mundi được đề xuất. Nó thuận tiện hơn nhiều. Nó chỉ là tốt để biết rằng bạn luôn có thể làm mới một tài sản tạm thời một cách rõ ràng cũng như bạn nên chọn. – svena

+0

Dường như các thuộc tính tạm thời không được làm mới: "Nếu cờ là CÓ, phương pháp này không ảnh hưởng đến bất kỳ thuộc tính tạm thời nào" https://developer.apple.com/reference/coredata/nsmanagedobjectcontext/1506224-refreshobject –

7

Đầu tiên, đảm bảo rằng thuộc tính tạm thời của bạn chỉ được sử dụng cho sectionNameKeyPath khi tạo bộ điều khiển kết quả tìm nạp của bạn. Tên tốt nhất là sectionIdentifier (như Apple thực hiện trong mã mẫu của họ.) Ngày thực tế phải là một thuộc tính riêng biệt của pháp nhân của bạn. (Tôi sẽ gọi nó là dateAttribute

Second, hãy chắc chắn rằng bạn chỉ định các phụ thuộc con đường quan trọng trong tập tin Entity.m của bạn:.

+ (NSSet *)keyPathsForValuesAffectingSectionIdentifier { 
    // If the value of dateAttribute changes, the section identifier may change as well. 
    return [NSSet setWithObject:@"dateAttribute"]; 
} 

Thứ ba, hãy chắc chắn rằng trong điều khiển của bạn, bạn phản ứng phù hợp với những thay đổi trong bối cảnh đối tượng được quản lý thông qua

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    if (!self.tableView.editing) [self.tableView reloadData]; 
    // the quick and dirty method without animations; 
    // see referenced code for a more pleasant approach 
} 

Nếu có gì không rõ ràng, hãy xem ví dụ của Apple DateSectionTitles.

+0

Bạn có chắc chắn 100% rằng các keyPathsForValuesAffecting ... có làm mới một sự làm mới trong khi nó là một thuộc tính tạm thời không? Trước đây tôi đã nhận thấy rằng các thuộc tính tạm thời được làm mới chỉ khi refreshObject: mergeChanges: được gửi đến đối tượng. – svena

+0

Vâng, chắc chắn rồi. Đây là mã hoạt động từ một ứng dụng trực tiếp. – Mundi

+0

Vì vậy, tôi đã thiết lập nó gần như chính xác như ví dụ của Apple, nhưng nó dường như không làm mới khi có thay đổi. Mã định danh phần cho từng mục được tạo ra bởi một phép tính lớn về sự khác biệt về nsdate, nhưng khi tôi khởi chạy ứng dụng, nó dường như không tính toán lại nó như khi tôi giết ứng dụng từ đa nhiệm và mở lại nó. – mhbdr

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