Table of Contents
مقدمه: چرا داده های هسته ای و NSFetchedResultsController Matter
در توسعه مدرن iOS، ارائه یک رابط کاربری مایع، پاسخگو اغلب بستگی به چگونگی موثر برنامه شما داده هایی که در طول زمان تغییر می کند، چه شما در حال ساخت یک خوراک اجتماعی، یک مدیر کار یا یک سیستم موجودی، داده های نمایش داده شده به کاربران به ندرت استاتیک است. - نمودار و چارچوب پایداری اپل - جفت با FR (C) ارائه می دهد راه حل های سربار برای حفظ داده های دستی بزرگ، در حالی که همگام سازی داده های دستی بزرگ است.
این مقاله یک راهنمای عمیق و عملی برای استفاده از داده های هسته با اعلان ها کلیدی است.هنگامی که اشیاء وارد، به روز رسانی یا حذف می شوند، متن این تغییرات را پخش می کند، که دقیقا همان چیزی است که (FLT:2 اهرم برای حفظ UI سازگار است.
برای مستندات توسعه دهنده رسمی، به مرجع چارچوب داده های مرکزی اپل مراجعه کنید.
کنترل کننده: پل بین داده های هسته ای و UI شما
یک شی کنترل کننده است که برای مدیریت موثر نتایج بازگشت از یک درخواست داده های هسته ای طراحی شده است، به ویژه هنگامی که داده های اساسی انتظار می رود تغییر کند. آن را نظارت بر زمینه شی مدیریت شده مربوطه و به طور خودکار گزارش تغییرات از طریق پروتکل نمایندگی آن.
ویژگی های کلیدی
- [[۱] [۱۰] [۱] [۱۰] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱۰] [۱] [۱۰] [۱] [۱۰] [۳] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]
- در بخش بندی: با مشخص کردن [FLT-7]، گروه های کنترل کننده نتایج را به بخش ها می رسانند، و آن را به نمایش گذاشتن دیدگاه های جدول یا جمع آوری تقسیم می کنند.
- بهینه سازی دقیق: FRC استفاده از خطا و Caching در زیر کاپوت، آن را تنها داده ها را به عنوان مورد نیاز و می تواند به صورت اختیاری از یک حافظه پایدار برای جلوگیری از دوباره درد کشیدن زمانی که بافت شیء مدیریت شده ذخیره شده است.
روش های Delegate در جزئیات
برای بهره برداری کامل از کنترل کننده، باید را پیاده سازی کنید، رایج ترین الگوی استفاده از این callbacks در داخل یا نماینده به روز رسانی UI است.
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>,
didChange anObject: Any,
at indexPath: IndexPath?,
for type: NSFetchedResultsChangeType,
newIndexPath: IndexPath?) {
switch type {
case .insert:
tableView.insertRows(at: [newIndexPath!], with: .fade)
case .delete:
tableView.deleteRows(at: [indexPath!], with: .fade)
case .update:
tableView.reloadRows(at: [indexPath!], with: .fade)
case .move:
tableView.moveRow(at: indexPath!, to: newIndexPath!)
@unknown default:
tableView.reloadData()
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
این الگو تضمین می کند که جدول تغییرات هم اتاقی را در همگام سازی با داده های زیر زمینی، جلوگیری از کج یا عدم انسجام مشاهده می کند.
پیاده سازی مرحله به مرحله
در زیر یک مثال کامل و آماده تولید با استفاده از Swift 5، با هدف قرار دادن iOS 15+، ما یک نهاد ساده به نام (FLT:12) با ویژگی های [FLT13] و [FLT 14: 14] (Bool) و (Date).
۱- تنظیم داده های اصلی Stack
در این میان، یا در آن، به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر استفاده می شود:
class PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "YourModelName")
container.loadPersistentStores { storeDescription, error in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
}
container.viewContext.automaticallyMergesChangesFromParent = true
}
}
۲- ایجاد کلاس فرعی NSObject
از ویرایشگر مدل داده Xcode برای تولید فایل های کلاس استفاده کنید یا آنها را به صورت دستی ایجاد کنید.اطمینان حاصل کنید که نهاد شما از تنظیمات ماژول کلاس صحیح استفاده می کند.
۳- درخواست Fetch و FRC را درک کنید
در کنترل کننده دید شما، درخواست را تنظیم کرده و کنترل کننده نتایج را آغاز کنید، بهتر است این کار را در [FLT 19] یا یک نمای مدل درون آن انجام دهید.
lazy var fetchedResultsController: NSFetchedResultsController<Task> = {
let fetchRequest: NSFetchRequest<Task> = Task.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "dueDate", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
// Optional: limit results with batch size for large datasets
fetchRequest.fetchBatchSize = 20
let controller = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: PersistenceController.shared.container.viewContext,
sectionNameKeyPath: "completionStatus", // e.g., a transient attribute or a computed property
cacheName: nil
)
controller.delegate = self
try? controller.performFetch()
return controller
}()
۴- جدول View را با FRC هدایت کنید
روش های شما (FLT 21) بسیار ناچیز است.
func numberOfSections(in tableView: UITableView) -> Int {
fetchedResultsController.sections?.count ?? 0
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionInfo = fetchedResultsController.sections![section]
return sectionInfo.numberOfObjects
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath)
let task = fetchedResultsController.object(at: indexPath)
configure(cell, with: task)
return cell
}
توجه داشته باشید که ما هرگز به صورت دستی (FLT:23) تماس نمی گیریم – روش های نمایندگی هر گونه قرار دادن، حذف و به روز رسانی را اداره می کنند.
استفاده پیشرفته و بهترین روش ها
امنیت Thread Safety
زمینه های داده های اصلی امن نیستند.همیشه از (که در صف اصلی اجرا می شود) برای تمام درخواست های مربوط به UI و FRCs استفاده کنید، یک چارچوب صف خصوصی ایجاد کنید و تغییرات را در متن دید ادغام کنید.
Caching
پارامتر می تواند عملکرد پرتاب را با ادامه بخش و اطلاعات شی بهبود بخشد، با این حال، اگر درخواست یا تغییرات مدل داده شما تغییر کند، باید کش ([FLT-26] را حذف کنید تا از فساد جلوگیری شود.
مدیریت داده های بزرگ
از [[FLT 27|استفاده کنید تا تعداد اشیاء به حافظه وارد شود؛ همچنین در نظر بگیرید که فقط اگر به دسترسی فوری به هر ملک نیاز دارید، برای داده های دارای ارتباطات، با پیش فرض (FLT 29) می توانید از خطاهای مکرر جلوگیری کنید.
ادغام با SwiftUI
در حالی که UIKit-centric است، شما هنوز هم می توانید آن را در SwiftUI با بستن آن در سوئیفت استفاده کنید، یا از بسته بندی اموال جدید استفاده کنید (که در داخل از یک مکانیسم مشابه استفاده می کند).
قرص های معمول و چگونگی اجتناب از آن
- (فَلَّهُمَهُمَهُمَهُمَهُوا بِهَهُمَهُمَهُمَهُمَهُمَهُمَهُمْهُمَهُمْهُمَهُمَهُمَهُوا مَهُمَهُمَهُوا مَهُمَهُمَهُمْهُوا مَهُوا مَهُمْهُمْهُمَهُوا مَهُمْهُمَهُمَهُمْهُمَهُوا مَهُمْهُمْهُمَهُمَهُوا مَهُمَهُوا مَهُمَهُمَهُمَهُمَهُوا مَهُمَهُمَهُمَهُمَهُمَهُوَهُوَهُمَهُوَهُمَهُوَهُم
- [در این باره] [و] [و] [و] [و] [و] [و] [و] [و] [و]] [و]] [و]] [و]] [به [و]]]] [و]]] [و [به] [و]]] [به [و]]] [به [و] [و] [به [و] [و [و [به [و]]] [و] [و] [به [و [و] [به [و]] [و [به [به [و] [و]]]] [به [و] [و] [و]]]] [به [به [به [و] [و] [به [و [و [به [و] [و] [و]] [و] [و] [و] [و]]]]] [و] [و [به [به [به [به [به [و]]]]]]]] [به [به [به [و] [و] [و] [و] [به [به [به [به [به [به [به [به [به [به
- (در این صورت، اگر نام شما از جمله ی اول نباشد، در این صورت، به صورت مستقیم به آن اشاره می شود.
- [FLT: [در کنار FRC] [FLT: 38] در حالی که FRC تغییرات جبران کننده می تواند منجر به تصادفات شود.
- تشخیص داده های هسته ای شکست را نجات می دهد؛ اگر زمینه را ذخیره کنید و خطا رخ دهد، FRC ممکن است آگاه نباشد و همیشه خطا را کنترل کند و استفاده از [FLT 39] را در زمینه های پس زمینه در نظر بگیرد.
ویژگی های Performance
در حال حاضر کارآمد است، اما در اینجا بهینه سازی اضافی:
- استفاده عاقلانه از پیش فرض; یک پیش بینی پیچیده می تواند سرعت اولیه را کاهش دهد.
- (وَهُمْهُمْهُمْهُمْهُمْهُمْهُمْهُمْهُمِهُوا مِنَّاِهِهُمْهِهِهُوا مِنِهُوا مِنَاِنِنِهِهِهِهُوا مِهِهِهُمِهُوا مِنِنِهِهِهُوا مِهُوا مِنِهِنِنِنِهِنِنِنِهُوا مِنِنِنِهُوا مِنِنِنِنِنِنِنِنِنِنِنْهُوا مِهُوا مِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِنِ
- [در این هنگام که در این زمینه به کار می رود، در این صورت، در این میان، تعداد [[رده ها]]، [[رده:رده:رده:رده:]]، [[رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:رده:
- (و اگر می دانید که به همه چیز در یک نتیجه دسترسی دارید، از [FLT] استفاده کنید تا از آنها پیش از آن استفاده کنید، اما با حافظه محتاط باشید.
برای یک شیرجه عمیق تر به عملکرد داده های اصلی، ببینید راهنمای عملکرد داده های اصلی اپل .
مثال های واقعی-World
مثال 1: درخواست چت
یک برنامه پیام رسانی لیستی از مکالمات را که توسط پیام های جدید تنظیم شده است، نشان می دهد پیام های ورودی جدید باید فوراً ظاهر شوند.با استفاده از FRC، دیدگاه تماس می تواند تنها به تغییرات در نهادهای مکالمه کاربر فعلی منجر شود.بخش پیام های گروه های تاریخ به "امروز"، "Yesterday"، و غیره.
مثال دوم: مدیریت موجودی
یک برنامه تجارت الکترونیک محصولات را در دسته ها نشان می دهد، زمانی که سطح سهام از یک همگام پس زمینه تغییر می کند، FRC به طور خودکار UI را به روز می کند.با تنظیم تا 50، این دیدگاه حتی با هزاران مورد پاسخگو باقی می ماند.
مثال 3: لیست را با دسته بندی ها انجام دهید
مثال کلاسیک: وظایفی که به «سرانجام» و «امروز» تقسیم شده اند، می توانند یک ویژگی گذرا باشند که از و تاریخ فعلی محاسبه شده است.اطمینان حاصل کنید که همان ارزش مشتق شده در نوع توصیف کننده برای جلوگیری از ناسازگاری استفاده می شود.
نتیجه گیری
تسلط بر ترکیب داده های هسته و سنگ بنای ساخت برنامه های قوی و پویا iOS است.با بارگیری بلند کردن سنگین ردیابی تغییر و هماهنگ سازی UI به چارچوب های اپل، شما می توانید بر ایجاد یک تجربه کاربری بزرگ به جای نوشتن کد مدیریت داده دیگ بخار تمرکز کنید.
چه شما یک برنامه UIKit میراث یا اتخاذ SwiftUI با ، اصول یکسان باقی می ماند: درک نمودار شی خود، پیکربندی درخواست های دقیق و اجازه دهید کنترل کننده نتایج حاصل از آن انجام آنچه که در این مقاله ذکر شده است - از جمله Caching، ایمنی موضوعات و تنظیم عملکرد - شما به خوبی مجهز به رسیدگی به هر گونه داده های تکامل در طول زمان.
برای بررسی بیشتر، بررسی کنید آموزش داده های اصلی راری وندرlich و ] ] ]NSHipster مقاله در مورد NSFetchedresController .