2010-01-26 26 views
9

Tôi có ứng dụng iPhone dựa trên dữ liệu cốt lõi cần lưu 1.000 đối tượng được quản lý khi chấm dứt. Điều này mất 8 + giây, tuy nhiên, hệ điều hành giết chết các ứng dụng nếu nó không hoàn thành trong khoảng. 6 giây.Lưu nền với Dữ liệu chính?

Tôi không muốn lưu các đối tượng trước đó, vì sau đó người dùng phải đợi 8 giây để kết quả hiển thị.

Có thể bằng cách nào đó lưu các đối tượng trước đó trong một chuỗi nền, trong khi vẫn có quyền truy cập (chỉ đọc) vào NSManagedObjectContext trong chuỗi chính để hiển thị dữ liệu không? Hoặc là bằng cách nào đó có thể sao chép các đối tượng được quản lý và chuyển các bản sao vào một chuỗi nền để lưu?

Để làm rõ, đây là những gì xảy ra trong ứng dụng ngay bây giờ: Tôi có một chuỗi nền nhập 1000+ đối tượng trong khoảng 1 giây. Nếu tôi lưu trong khi nhập, phải mất nhiều thời gian hơn 1 giây. Vì vậy, để hiển thị các mục đó với độ trễ tối thiểu, ngữ cảnh được lưu lại mà không lưu vào luồng chính và người dùng nhận kết quả của mình nhanh nhất có thể.

Tôi hiện có vấn đề về cách lưu các đối tượng này mà không cần phải chờ 8 giây. Nếu tôi lưu trong chuỗi nền trước khi bàn giao, người dùng phải đợi. Nếu tôi lưu trong chuỗi tiền cảnh sau khi chuyển giao, người dùng phải đợi. Chỉ có hai cách tiếp cận có thể tôi có thể nhìn thấy ngay bây giờ là:

  1. Bằng cách nào đó có dữ liệu cốt lõi làm sqlite nó truy cập ở chế độ nền, trong khi vẫn giữ các chủ đề chính phản ứng
  2. Bàn giao các đối tượng chưa được lưu từ một bối cảnh khác, và lưu trong chuỗi nền

Cả hai cách tiếp cận dường như không thể (ít nhất là theo tài liệu Lõi dữ liệu). Vì vậy, không có giải pháp khác hơn để có người dùng chờ đợi lâu hơn (và có thể hiển thị một kính quay tốt đẹp giờ :-)?

Kính trọng, Jochen

Trả lời

8

Vâng, có một cách để tiết kiệm bối cảnh đối tượng quản lý từ sợi nền, hay chính xác hơn, nó thường được gọi là "nhập khẩu trong thread nền, và hiển thị trong các chủ đề chính . " Bằng cách này, các đối tượng được quản lý được lưu từng mảnh một khi chúng được nhập khẩu, không phải tất cả cùng một lúc khi kết thúc.

Tôi vừa viết câu trả lời ngắn cho một câu hỏi tương tự tại đây tại SO, nhưng bạn nên đọc số Apple doc này. Có rất nhiều cạm bẫy tiềm ẩn, vì vậy hãy đọc rất, rất cẩn thận. Và sau đó đọc Apple's "Efficiently Importing Data". Đây cũng là một phải đọc! Và CoreData book của Marcus Zarra cũng hữu ích.

CoreData multithreading là một chút khó khăn, nhưng nó thực sự đền đáp. Chúc may mắn!

+3

Đồng ý. Tiết kiệm cho họ trong khi làm việc nhập khẩu là hiệu quả hơn rất nhiều so với làm một tiết kiệm lớn về lối ra. Tôi cũng đã làm một hướng dẫn nhập khẩu tốt đẹp trên trên mạng nhà phát triển Mac thậm chí còn giải thích làm thế nào để làm nền tiết kiệm. –

+1

Cảm ơn sự giúp đỡ. Tôi đã thử lưu trong khi nhập, với kết quả là thời gian nhập tăng lên. Nó nhanh hơn tiết kiệm ở cuối, nhưng vẫn chưa đủ nhanh. Tôi đã làm rõ câu hỏi về vấn đề này, và tôi chắc chắn đồng ý rằng đa luồng dữ liệu lõi là khó khăn ... – Jochen

+0

1. Của bạn nên có thể. Chỉ cần tạo một 'NSManagedObjectContext' cho mỗi luồng. Và trong khi nhập trong nền, không tạo tất cả 1000 thực thể cùng một lúc và lưu cùng một lúc. Thay vào đó, hãy tạo 10 thực thể trong ngữ cảnh, lưu chúng, chuyển chúng vào luồng chính và lặp lại quá trình này.Người dùng không thể thấy 1000 mục nhập cùng một lúc trong mọi trường hợp, vì vậy, bạn có thể đánh lừa người dùng theo cách mà tất cả dữ liệu có sẵn. – Yuji

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