প্রশ্ন : আমি কীভাবে আমার সন্তানের প্রসঙ্গে পিতামৃত প্রসঙ্গে পরিবর্তনগুলি দেখতে দেখতে পাব যাতে তারা আমার এনএসফ্যাচড্রিজাল্টস কনট্রোলারটিকে ইউআই আপডেট করতে ট্রিগার করে?
এখানে সেটআপ দেওয়া আছে:
আপনার কাছে এমন একটি অ্যাপ্লিকেশন পেয়েছে যা প্রচুর এক্সএমএল ডেটা ডাউনলোড করে এবং যুক্ত করে (প্রায় 2 মিলিয়ন রেকর্ড, প্রতিটি পাঠ্যের একটি সাধারণ অনুচ্ছেদের আকার) প্রায় .sqlite ফাইলটি প্রায় 500 এমবি আকারের হয়ে যায়। কোর ডেটাতে এই বিষয়বস্তুটি যুক্ত করতে সময় লাগে, তবে আপনি চান যে ব্যবহারকারী ক্রমবর্ধমানভাবে ডেটা স্টোরে লোড হওয়ার সাথে সাথে অ্যাপটি ব্যবহার করতে সক্ষম হন। এটি ব্যবহারকারীর কাছে অদৃশ্য এবং দুর্ভেদ্য হতে পারে যে প্রচুর পরিমাণে ডেটা চারপাশে স্থানান্তরিত হচ্ছে, সুতরাং কোনও ঝুলন্ত নেই, কোনও জিটটার নেই: মাখনের মতো স্ক্রোল। তবুও, অ্যাপটি আরও কার্যকর, এতে আরও বেশি পরিমাণে ডেটা যুক্ত করা হয়, তাই কোরা ডেটা স্টোরটিতে ডেটা যুক্ত হওয়ার জন্য আমরা চিরকাল অপেক্ষা করতে পারি না। কোডে এর অর্থ আমি আমদানি কোডে এই জাতীয় কোড এড়াতে চাই:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]];
অ্যাপ্লিকেশনটি আইওএস 5 কেবলমাত্র তাই এটি সমর্থন করার জন্য ধীরতম ডিভাইসটি একটি আইফোন 3GS।
আমার বর্তমান সমাধানটি বিকাশের জন্য আমি এখন পর্যন্ত যে সংস্থানগুলি ব্যবহার করেছি:
অ্যাপলের কোর ডেটা প্রোগ্রামিং গাইড: দক্ষতার সাথে ডেটা আমদানি করা
- স্মৃতিশক্তি কম রাখার জন্য অটোরিলিজ পুল ব্যবহার করুন
- সম্পর্কের ব্যয়। ফ্ল্যাট আমদানি করুন, তারপরে সম্পর্কের শেষে প্যাচ আপ করুন
- আপনি যদি এটি সহায়তা করতে পারেন তবে জিজ্ঞাসা করবেন না, এটি ও (N ^ 2) পদ্ধতিতে জিনিসগুলি ধীর করে দেয়
- ব্যাচগুলিতে আমদানি করুন: সংরক্ষণ করুন, পুনরায় সেট করুন, নিকাশ এবং পুনরাবৃত্তি করুন
- আমদানিতে আনডো ম্যানেজারটি বন্ধ করুন
iDeveloper TV - কোর ডেটা পারফরম্যান্স
- ৩ টি প্রসঙ্গ ব্যবহার করুন: মাস্টার, মূল এবং সীমাবদ্ধ প্রসঙ্গের প্রকারগুলি
iDeveloper TV - ম্যাক, আইফোন এবং আইপ্যাড আপডেটের জন্য মূল ডেটা
- পারফর্মব্লক দিয়ে অন্যান্য কাতারে সাশ্রয় চালানো জিনিসগুলিকে দ্রুত করে তোলে।
- এনক্রিপশন জিনিসগুলিকে ধীর করে দেয়, আপনি যদি পারেন তবে এটি বন্ধ করুন।
মার্কাস জারার দ্বারা কোর ডেটাতে বড় ডেটা সেটগুলি আমদানি এবং প্রদর্শন করা হচ্ছে
- আপনি বর্তমান রান লুপকে সময় দিয়ে আমদানিটি ধীর করতে পারেন, যাতে ব্যবহারকারীর পক্ষে জিনিসগুলি স্বাচ্ছন্দ্য বোধ করে।
- নমুনা কোড প্রমাণ করে যে বড় আমদানি করা এবং ইউআইকে প্রতিক্রিয়াশীল রাখা সম্ভব, তবে 3 টি প্রসঙ্গ এবং ডিস্কে অ্যাসিঙ্ক সংরক্ষণের মতো দ্রুত নয়।
আমার বর্তমান সমাধান
আমি NSManagedObjectContext এর 3 টি উদাহরণ পেয়েছি:
মাস্টার ম্যানেজডঅবজেক্ট কনটেক্সট - এটি এমন প্রসঙ্গ যা NSPers ContinStoreCoordinator রয়েছে এবং ডিস্কে সংরক্ষণের জন্য দায়বদ্ধ। আমি এটি করি তাই আমার সঞ্চয়গুলি অ্যাসিক্রোনাস হতে পারে এবং তাই খুব দ্রুত। আমি এটিকে এটির মতো লঞ্চটিতে তৈরি করেছি:
masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[masterManagedObjectContext setPersistentStoreCoordinator:coordinator];
mainManagedObjectContext - এটি ইউআই সর্বত্র ব্যবহার করা প্রসঙ্গ। এটি মাস্টার ম্যানেজডঅবজেক্ট কনটেক্সটের একটি শিশু। আমি এটি এর মতো তৈরি করি:
mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[mainManagedObjectContext setUndoManager:nil];
[mainManagedObjectContext setParentContext:masterManagedObjectContext];
ব্যাকগ্রাউন্ডকন্টেক্সট - এই প্রসঙ্গটি আমার এনএসওপেশন সাবক্লাসে তৈরি করা হয়েছে যা XML ডেটা কোর ডেটা আমদানির জন্য দায়ী responsible আমি এটিকে অপারেশনের মূল পদ্ধতিতে তৈরি করেছি এবং এটিকে সেখানে মাস্টার প্রসঙ্গে যুক্ত করব।
backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[backgroundContext setUndoManager:nil];
[backgroundContext setParentContext:masterManagedObjectContext];
এটি আসলে খুব দ্রুত কাজ করে। কেবলমাত্র এই 3 প্রসঙ্গের সেটআপ করে আমি 10x এর বেশি দ্বারা আমার আমদানির গতি উন্নত করতে সক্ষম হয়েছি! সত্য, এটি বিশ্বাস করা কঠিন। (এই প্রাথমিক নকশাটি স্ট্যান্ডার্ড কোর ডেটা টেম্পলেটটির অংশ হওয়া উচিত ...)
আমদানি প্রক্রিয়া চলাকালীন আমি 2 বিভিন্ন উপায়ে সংরক্ষণ করি। প্রতি 1000 আইটেম আমি পটভূমি প্রসঙ্গে সংরক্ষণ করি:
BOOL saveSuccess = [backgroundContext save:&error];
তারপরে আমদানি প্রক্রিয়া শেষে, আমি প্রধান / পিতামাতার প্রসঙ্গে সংরক্ষণ করি যা সম্ভবত, মূল প্রসঙ্গে সহ অন্যান্য শিশু প্রসঙ্গে পরিবর্তনের দিকে ধাক্কা দেয়:
[masterManagedObjectContext performBlock:^{
NSError *parentContextError = nil;
BOOL parentContextSaveSuccess = [masterManagedObjectContext save:&parentContextError];
}];
সমস্যা : সমস্যাটি হ'ল আমি এই ভিউটি পুনরায় লোড না করা পর্যন্ত আমার ইউআই আপডেট হবে না।
আমার কাছে একটি ইউআইটিবেল ভিউ সহ একটি সাধারণ ইউআইভিউ কনট্রোলার রয়েছে যা একটি এনএসফ্যাচডরেসাল্টস কন্ট্রোলার ব্যবহার করে ডেটা খাওয়ানো হচ্ছে। যখন আমদানি প্রক্রিয়াটি সম্পূর্ণ হয়, এনএসফ্যাচডেরসাল্টস কন্ট্রোলার পিতামাতা / মাস্টার প্রসঙ্গে কোনও পরিবর্তন আসে না এবং তাই ইউআই স্বয়ংক্রিয়ভাবে আপডেট হয় না যেমন আমি দেখতে অভ্যস্ত। আমি যদি ইউআইভিউউকন্ট্রোলারটিকে স্ট্যাকটি থেকে সরিয়ে ফেলে আবার লোড করি তবে সমস্ত ডেটা আছে there
প্রশ্ন : আমি কীভাবে আমার সন্তানের প্রসঙ্গে পিতামৃত প্রসঙ্গে পরিবর্তনগুলি দেখতে দেখতে পাব যাতে তারা আমার এনএসফ্যাচড্রিজাল্টস কনট্রোলারটিকে ইউআই আপডেট করতে ট্রিগার করে?
আমি নিম্নলিখিতটি চেষ্টা করেছি যা কেবলমাত্র অ্যাপ্লিকেশনটিকে স্তব্ধ করে তুলেছে:
- (void)saveMasterContext {
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:masterManagedObjectContext];
NSError *error = nil;
BOOL saveSuccess = [masterManagedObjectContext save:&error];
[notificationCenter removeObserver:self name:NSManagedObjectContextDidSaveNotification object:masterManagedObjectContext];
}
- (void)contextChanged:(NSNotification*)notification
{
if ([notification object] == mainManagedObjectContext) return;
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
return;
}
[mainManagedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}