2010-01-16 39 views
7

Tôi đã hoàn tất chuyển đổi ứng dụng của mình để sử dụng lớp CoreData cho một kho dữ liệu nhỏ mà tôi muốn sử dụng. Tôi có một số lo ngại về hiệu suất và cách sử dụng tốt nhất. Cụ thể: Tôi có rất nhiều lần chạy mà tôi đọc từ các thuộc tính đĩa trong các tệp: mỗi thuộc tính sẽ tạo một đối tượng mới, trừ khi một đối tượng thuộc loại đó và giá trị đó đã tồn tại. Vì vậy, đối với mỗi tệp tôi đọc, tôi: thực hiện tìm nạp để kiểm tra xem đối tượng được quản lý đó đã tồn tại hay chưa; nếu có kết thúc, nếu không tôi tạo đối tượng, gán giá trị và lưu ngữ cảnh.Hiệu năng CoreData về tiết kiệm bối cảnh

Hiện tại, tôi lưu ngữ cảnh một lần cho mỗi lần tôi tạo đối tượng mới, vì vậy nó xảy ra nhiều hơn hoặc ít hơn mười lần (đối với mười thuộc tính) cho mỗi tệp đọc (có thể là hàng trăm). Sẽ tốt hơn nếu giảm bớt các điểm lưu ngữ cảnh, có thể một lần cho tệp thay vì một lần cho thuộc tính? Tôi không biết chi phí của hoạt động này vì vậy tôi không biết nếu là ok để làm điều này rất thường xuyên, hoặc làm thế nào để tìm ra thời gian dành cho điều này (có thể với các công cụ? Không thực sự biết làm thế nào).

Trả lời

11

Không cần phải lưu sau khi đặt từng thuộc tính.

Thông thường, bạn chỉ lưu một đối tượng được quản lý khi mã được thực hiện với nó khi lưu đặt lại hoàn tác. Trong phần thiết lập bạn mô tả, bạn có thể tạo hàng trăm đối tượng được quản lý một cách an toàn trước khi lưu chúng vào lưu trữ vĩnh viễn. Bạn có thể có một số lượng lớn (hàng nghìn) đối tượng nhẹ (thuộc tính văn bản) trong bộ nhớ mà không đặt bất kỳ sự căng thẳng nào trên iPhone.

Vấn đề duy nhất trên iPhone là bạn không bao giờ biết khi nào ứng dụng sẽ bị tạm ngưng hoặc tắt. Điều này giúp tiết kiệm phổ biến hơn so với các nền tảng khác. Tuy nhiên, không đến mức bạn hiện đang sử dụng.

Core Data Performance section hướng dẫn có thể giúp bạn lên kế hoạch. Các công cụ cho phép bạn xem chi tiết về hiệu suất của Dữ liệu lõi.

Tuy nhiên, tôi sẽ không làm bất cứ điều gì cho đến khi bạn thử nghiệm ứng dụng với rất nhiều dữ liệu và thấy nó chậm. Tối ưu hóa sớm là nguồn gốc của tất cả điều ác. Đừng lãng phí thời gian cố gắng để ngăn chặn một vấn đề bạn có thể không có.

+0

Vâng, điểm dừng đột ngột/đình chỉ chính xác là điều tôi lo lắng. Dù sao tôi sẽ đồng ý rằng nó là đủ để tiết kiệm tối đa một lần cho mỗi tập tin, nhóm tất cả các thuộc tính trong một "chạy" duy nhất. Cảm ơn bạn cho con trỏ đến phần hiệu suất cũng. – Andy

+0

Liên kết Hiệu suất Dữ liệu Chính hiện tại: https://developer.apple.com/library/prerelease/watchos/documentation/Cocoa/Conceptual/CoreData/Performance.html – jQwierdy

3

Để ngăn chặn một "đột ngột xin dừng" vấn đề bạn có thể thực hiện một cái gì đó giống như phương pháp mà:

- (void)saveContext { 

NSError *error = nil; 
NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 


if (managedObjectContext != nil) { 
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
     /* 
     Replace this implementation with code to handle the error appropriately. 

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
     */ 
     LogError(@"Unresolved error %@, %@", error, [error userInfo]); 
      // abort(); 
    } 
} 

}

và sử dụng nó trong hai phương pháp đại biểu ứng dụng của bạn:

- (void)applicationWillTerminate:(UIApplication *)application; 

- (void)applicationDidEnterBackground:(UIApplication *)application; 

Nghĩ rằng nó có thể không phải là giải pháp 100%, nhưng trong hầu hết các trường hợp, nó sẽ làm việc ...

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