Câu hỏi tôi muốn tự hỏi, trong trường hợp của bạn, là "ai thực hiện ngăn xếp Dữ liệu cốt lõi" thuộc về "?" Các dữ liệu chính nó thực sự là tỉnh của ứng dụng, phải không? (Dữ liệu lõi CF trên máy Mac, nơi bạn có thể có một ứng dụng có khả năng làm việc với nhiều tài liệu cùng một lúc, do đó, ngăn xếp Dữ liệu cốt lõi thuộc về mỗi tài liệu.)
Trong mọi ứng dụng Cocoa/Cocoa Touch, App Delegate thường là phương tiện ưa thích của việc tùy chỉnh hành vi của ứng dụng, vì vậy đây là nơi tự nhiên cho ngăn xếp Dữ liệu cốt lõi.
Bây giờ, vấn đề tôi nghi ngờ bạn đang gặp phải là nó cảm thấy sai lầm khi liên tục viết những thứ như:
NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
Những gì tôi thường làm trong những trường hợp này là viết chức năng (không phải phương pháp) như thế này:
NSManagedObjectContext *UIAppManagedObjectContext() {
return [*(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
Tôi viết chức năng tương tự cho NSPersistentStoreCoordinator
và NSManagedObjectModel
. Tôi đặt tất cả các tệp này trong các tệp .h/.m của App Delegate, vì đây cũng là các đối tượng cấp ứng dụng.
Không sử dụng tiêm phụ thuộc chắc chắn là một thiết kế tồi tệ khi tôi lần đầu tiên bắt đầu sử dụng Dữ liệu cốt lõi. Gần đây, tôi có cách tiếp cận tương tự như bạn đã vạch ra. Sự khác biệt chính là tôi đã đặt Mã ngăn xếp dữ liệu cốt lõi trong một danh mục trên Ngữ cảnh NSManagedObject, nếu chỉ để tách biệt mã ngăn xếp lõi dữ liệu khỏi AppDelegate. Về lý thuyết, tôi có thể sử dụng danh mục như một singleton, nhưng tôi chọn không như nó giới thiệu "độ cứng ứng dụng" như bạn đã nói. Ngoài ra, tôi sử dụng một số mã tùy chỉnh cho ngăn xếp Dữ liệu cốt lõi và điều này cho phép tôi thả mã này vào các dự án mới một cách dễ dàng. –
Tôi đồng ý với bạn về việc sử dụng App Delegate để tạo ngăn xếp Dữ liệu cốt lõi. Tôi đang sử dụng một UITabBarController như điều khiển xem gốc của tôi, và tôi không chắc chắn làm thế nào để tuyên truyền bối cảnh cho đối tượng điều khiển đó, vì nó sống trong MainWindow.xib và tôi không chắc chắn làm thế nào để gán cho nó một con trỏ đến một ManagedObjectContext. Tôi nghĩ rằng tôi đang đăng một câu hỏi riêng cho việc này. – mvexel
Tài liệu Apple đó nói, "Khi bạn tạo một bộ điều khiển xem, bạn vượt qua nó bối cảnh nó nên sử dụng." nhưng tôi không thấy CÁCH này được thực hiện. Bộ điều khiển chế độ xem chính được tạo thông qua bảng phân cảnh, nếu sử dụng bảng phân cảnh, phải không? Vì vậy, làm thế nào để vượt qua nó bối cảnh? –