لماذا مسائل البيانات في الوقت الحقيقي في تطبيقات النظام المتكامل الحديثة

ويتوقع المستعملون أن يشعروا بالحياة - وينبغي أن تظهر رسائل الدردشة على الفور، وينبغي أن تستكمل اللوحات القيادية دون تجديد يدوي، وينبغي أن تعكس الأدوات التعاونية التغييرات التي يجريها الآخرون في الوقت الحقيقي، وأن يكفل المطورون في نظام المعلومات المتكامل، وأن يوفروا أفضل التقنيات المتاحة، وأن يستكملوا البيانات في الوقت الحقيقي.

وعلى عكس النهج التقليدي القائم على النتائج، الذي يتطلب إجراء اقتراع أو تجديد يدوي، فإن قاعدة بيانات قاعدة الإطفاء في الوقت الحقيقي، وقاعدة بيانات فيرستور، تقدمان تحديثات مدفوعة بالأحداث، وعندما تُدخل تغييرات في البيانات على الخادم، تدفع شركة SDK هذه التغييرات إلى كل زبون متصل، في كثير من الأحيان في غضون ثواني، مما يجعلها مثالية لاستخدام حالات مثل الدردشة الحية، والتحرير التعاوني، والسجلات الرياضية الحية، وأنا أيضا.

قاعدة بيانات عصرية من قاعدة إطلاق النار ضد كلود فايرستوير

وتوفر قاعدة الإطفاء حلين أساسيين لقاعدة البيانات: قاعدة البيانات الأصلية في الوقت الحقيقي (RTDB) وقاعدة بيانات السحاب الأحدث، في حين أن كلا منهما يدعم التزامن في الوقت الحقيقي، فإنهما يختلفان في نماذج البيانات، وقدرات الاستفسار، والتسعير، فاختيار الشخص المناسب هو أول قرار حاسم.

قاعدة بيانات الوقت الحقيقي

ويخزن المكتب بياناته كشجرة واحدة كبيرة من شجرة يوكون، ومن السهل وضع وتشغيل مجموعات البيانات الصغيرة والمتوسطة الحجم التي تُستحوذ على ضحلة ضحلة، ويُعتبر هذا الخيار خيارا كبيرا عندما يحتاج تطبيقك إلى مزامنة بيانات صغيرة متغيرة في كثير من الأحيان مثل حالة الوجود أو حالة اللعبة، غير أنه لا يُستفحل إلا على شكل نوع من أنواع البيانات ومرشحة في وقت واحد.

مشعل النار

وتُنظَّم البيانات في شكل وثائق داخل مجموعات، مما يتيح هياكل هرمية، والاستفسارات المركبة، والتكرار التلقائي المتعدد المستويات، كما أنَّ نظام الإطفاء يقدم دعماً أكثر ثراءً، بما في ذلك التصفير المتطور، والفرز، والتجميع، كما يوفر ضمانات أقوى للاتساق، ويزيد من حدة الاختلاف في عدد المشاريع الجديدة،

ولغرض هذه المادة، سنركز على كلود فايرستوير كما هو المعيار الحديث، غير أن مفاهيم المستمعين ومناولة البيانات تنطبق على نفس المستوى الذي تطبقه شركة RTDB مع تغييرات بسيطة في النسيج.

وضع قاعدة إطفاء في مشروعك

قبل أن تبدأي بالاستماع إلى تغييرات البيانات، عليكِ أن تدمجي قاعدة الإطفاء في مشروعكِ للزجاج،

الخطوة 1: إنشاء مشروع قاعدة إطفاء

إذهب إلى Firebase Console ونقر "Add Project".

الخطوة 2: سجل تطبيقات نظامك

وفي استعراض مشروع كونسول في قاعدة الإطفاء، تستغل جهاز iOS لإضافة تطبيق نظام iOS، وستحتاجون إلى جهاز تحديد هوية زبد الخاص بكم (الصوت في Xcode في إطار الأطر العامة لهدفيكم) وتدرجون في اختيار اسما مثل " إنتاج اليوسفي " وسجلكم للأوراق (يمكن تركه فارغا لأغراض التنمية) وتحمّلوا الملف المولّد .

- أن تسحبي ملف إلى جذور مشروعك Xcode، وأن تضمني إضافة ذلك إلى جميع الأهداف، وأن يتم فحص المواد الورقية إذا لزم الأمر، ولا تضيفيها إلى " Info.plist " ، بل ينبغي أن تظل ملفا منفصلا.

الخطوة 3: تركيب قاعدة الإطفاء

يمكن تركيب قاعدة إطفاء بواسطة شركة كوكا بود أو مديرة مجموعة التعبئة (سويفت) أو يدوياً، مدير التعبئة هو الآن النهج المعياري، وفي Xcode، ينبغي أن تُنقل إلى File > Add Packages.

بعد إضافة الطرد، سيحل (إكسيكودي) حالات الإعتماد ويحمّل (سي دي كي) ثمّ يستورد الوحدات في ملفات (سويفت)

الخطوة 4: بدء تشغيل قاعدة إطفاء

في طلبكم أو داخل ] تدنيس تطبيق سويفتو، الاتصال قبل استخدام أي خدمات في قاعدة الإطفاء.

import UIKit
import FirebaseCore

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
 FirebaseApp.configure()
 return true
 }
}

بالنسبة لـ (سويفت) يستعمل دورة الحياة الجديدة يمكنك استخدام أو الإصدار الأولي في [الإنف إل تي: 12]

import SwiftUI
import FirebaseCore

@main
struct MyApp: App {
 init() {
 FirebaseApp.configure()
 }
 var body: some Scene {
 WindowGroup {
 ContentView()
 }
 }
}

تنفيذ مستمعي البيانات في الوقت الحقيقي مع منظمة " فايرستوير "

وتتيح لكم محطة الإطفاء الاستماع إلى التغييرات في وثيقة أو مجموعة أو استفسار، ويطلق المستمع أولاً على البيانات الحالية، ثم مرة أخرى كلما حدث أي تغيير، ويتحقق ذلك باستخدام أسلوب .

الاستماع إلى وثيقة واحدة

افترض أن لديك وثيقة عن مستعمل يمكن أن يستكملها المستعمل أو بواسطة مسمّى يمكنك الاستماع إلى تلك الوثيقة وتحديث مخبرك آلياً:

import FirebaseFirestore

let db = Firestore.firestore()
let docRef = db.collection("users").document("user123")

docRef.addSnapshotListener { documentSnapshot, error in
 guard let document = documentSnapshot else {
 print("Error fetching document: \(error!)")
 return
 }
 guard let data = document.data() else {
 print("Document data was empty.")
 return
 }
 print("Current data: \(data)")
 // Update UI with the new data
}

هذا المستمع يبقى مسجلاً حتى تزيله صراحةً أو يُعالج موضوع المستمع

var listener: ListenerRegistration?

func startListening() {
 listener = docRef.addSnapshotListener { snapshot, error in
 // handle snapshot
 }
}

func stopListening() {
 listener?.remove()
}

الاستماع إلى مجموعة مع القراصنة

في كثير من الأحيان عليك الاستماع إلى مجموعة ممزقة بشروط معينة، على سبيل المثال، كل الرسائل في غرفة الدردشة التي أمرت بها الزمان،

let query = db.collection("messages")
 .whereField("roomId", isEqualTo: "room123")
 .order(by: "timestamp", descending: false)

query.addSnapshotListener { querySnapshot, error in
 guard let snapshot = querySnapshot else {
 print("Error listening to messages: \(error!)")
 return
 }
 snapshot.documentChanges.forEach { change in
 switch change.type {
 case .added:
 print("New message: \(change.document.data())")
 case .modified:
 print("Message updated: \(change.document.data())")
 case .removed:
 print("Message removed: \(change.document.data())")
 }
 }
}

وباستخدام ] يسمح لك بتقدير تحديث القائمة بكفاءة - لا يُبلغ إلا عن الأصناف المتغيرة، وليس مجمل النتائج المحددة، وهذا مفيد بشكل خاص للحديث أو تغذية الأنشطة.

معالجة تحديث البيانات بفعالية

فالتحديثات في الوقت الحقيقي قوية، ولكنها يمكن أن تؤدي أيضا إلى مسائل الأداء والاستخدام المفرط للشبكة إذا لم تعالج على النحو المناسب، ولنستكشف أفضل الممارسات لإدارة تحديثات البيانات في تطبيق نظام التشغيل المتكامل للإنتاج.

الحجم الأمثل للحمولة

ويعود كل طلقات سريعة إلى بيانات وثيقة كاملة، حتى ولو تغير ميدان واحد فقط، وينظر في استخدام وثائق أصغر، مثلا بدلا من تخزين بيانات ثنائية كبيرة )مثل الصور أو الفيديو( في فايرستور، وتخزين اليوران إلى تخزين الكلاود، وكذلك تجنب تخزين البيانات ذات الصلصة العميقة في وثيقة واحدة، مما يقسمها إلى وثائق مائلة إذا لزم الأمر.

استخدام مقاومة التقادم

ويقدم مخزن الإطفاء المثبت للعناوين المتنقلة، وعندما يكون ذلك ممكنا، يخصص جهاز الاتصال نسخة من البيانات محليا، وإذا فقد الجهاز شبكة، يمكن أن يستمر التطبيق في قراءة البيانات وكتابتها؛ وعندما يعود الاتصال، فإنه يتزامن تلقائيا، وهذا أمر حاسم بالنسبة لتجربة المستعملين السلسة.

ولتمكين من الاستمرار خارج الشبكة، تضاف خط واحد قبل أن تتصل :]

let settings = FirestoreSettings()
settings.isPersistenceEnabled = true
let db = Firestore.firestore()
db.settings = settings

ومع تمكين المستمعين من الاصطدام، سيطلقون النار أولاً مع البيانات المخبأة (إن وجدت)، ثم يستكملون البيانات عندما تصل بيانات الخادم، وهذا يمكن أن يجعل التطبيق أسرع، لا سيما على الشبكات البطيئة.

إدارة دورة حياة المستمعين

ويستهلك كل مستمع نشط الموارد (الشبكات والذاكرة ووحدة الممنوعات) وفي نظام UIKit، من الأفضل أن يضيف المستمعين في وأن يزيلهم في وفي سويفتو، يمكن استخدام /[FLT] [الاسم الكاتب:24]]

override func viewWillAppear(_ animated: Bool) {
 super.viewWillAppear(animated)
 startListeningToMessages()
}

override func viewDidDisappear(_ animated: Bool) {
 super.viewDidDisappear(animated)
 stopListening()
}

التعامل مع الأشرار

كما أن شبكات الصواريخ تفشل أحياناً، كما أن قاعدة الإطفاء الخاصة بك المستمع المفاجئ يتلقى مواصفات خاطئة، وتحقق منها دائماً، وإذا فشل المستمع، قد ترغب في إظهار زر " مغادر " أو مؤشر مركز، وتوخي الحذر بشأن إعادة التجفيف تلقائياً، قد تخلق حلقة غير نهائية، بدلاً من ذلك، تدوين الخطأ وإبلاغ المستخدم.

وتشمل الأخطاء المشتركة رفض الإذن (القواعد الأمنية)، وعدم كفاية الحصص، أو انقطاع الشبكات، وضمان أن تكون قواعد أمن قاعات الإطفاء مهيأة بشكل صحيح للسماح بالقراءات/الكتب فقط عند الاقتضاء، ولأجل التنمية، يمكن أن تبدأ بقواعد مفتوحة، ولكن تتحول إلى قواعد سليمة قائمة على التوثيق قبل الإفراج.

المراسلات والكتابات

وعند تحديث الوثائق المتعددة في وقت واحد )مثلا، وضع رسالة على النحو التالي: قراءة واستكمال آخر مرة قراءة للحديث(، استخدمي كتاباً لبطاقة فايرستوير لضمان الذرة:

let batch = db.batch()
let messageRef = db.collection("messages").document("msg1")
batch.updateData(["read": true], forDocument: messageRef)
let userRef = db.collection("users").document("user123")
batch.updateData(["lastRead": Timestamp()], forDocument: userRef)
batch.commit { error in
 if let error = error {
 print("Batch write failed: \(error)")
 } else {
 print("Batch write succeeded.")
 }
}

بالنسبة للعمليات التي تتطلب قراءة البيانات قبل الكتابة، تستخدم المعاملات، مثلاً، لإلغاء حساب المخزون، يجب أن تضمن عدم قيام أي عميل آخر بتغييره بين معاملات فايرستوري بمعالجة هذا الأمر بتفاؤل.

النظر في الطلبات المقدمة في الوقت الحقيقي

بمجرد أن يعمل دمجك الحقيقي، قد ترغب في معالجة مواضيع أكثر تقدما مثل الأمن، والقابلية للتصعيد، والإدماج مع خدمات القاعدة الأخرى.

قواعد أمن قاعدة إطلاق النار

الوصول إلى العملاء في الوقت الحقيقي يعني أن أي شخص لديه قاعدة بياناتك يمكنه أن يحاول القراءة أو الكتابة قواعد الأمن هي خط دفاعك الأول

rules_version = '2';
service cloud.firestore {
 match /databases/{database}/documents {
 match /users/{userId} {
 allow read, write: if request.auth != null && request.auth.uid == userId;
 }
 match /messages/{message} {
 allow read: if request.auth != null;
 allow create: if request.auth != null;
 allow update, delete: if request.auth != null && resource.data.authorId == request.auth.uid;
 }
 }
}

دائماً ما تختبر قواعدك في ساحة اللعب بقواعد قاعدة الإطفاء قبل نشرها

التوثيق ومعرفة المستعمل

ومعظم التطبيقات في الوقت الحقيقي تتطلب توثيقاً للمستعملين، إذ أن التوثيق في قاعدة الإطفاء يدعم البريد الإلكتروني/الكلمة السريّة، ورقم إشارة غوغل في، ورقم الإشارة في فوغل، وكثير من مقدمي الخدمات الآخرين، وبعد التوثيق، يمكن لكل مستمع أن يستخدم اعتراضاً على بيانات التصفية، وللوجود (العرض على الإنترنت)، يمكنك استخدام قاعدة بيانات التفكك في نهاية المطاف [القيمة البديلة:

وظائف السحاب لتجهيز السيرفر - الجانب

ولا ينبغي أن تحدث بعض العمليات على العميل - على سبيل المثال، جمع البيانات، إرسال إخطارات دفع، أو إضفاء الصبغة على المدخلات، مما يتيح لك تشغيل نظام مشغل جانب الخادم الذي تُطلقه أحداث فايستوري، مثلا، عندما يتم إعداد وثيقة رسالة جديدة، يمكن أن ترسل رسالة إلى المتلقي، مما يبقي رمز عملائك مضاءا ومؤمنا.

exports.onNewMessage = functions.firestore
 .document('messages/{messageId}')
 .onCreate((snap, context) => {
 const message = snap.data();
 // Send push notification using Firebase Cloud Messaging
 });

الأداء في مجال جدولة الأنصبة

وتتجنب كتابة مستند واحد بشكل متكرر جدا (مثلا، منضدة عالمية) - استخدام مضادات موزعة أو الاعتماد على التجميع، وترصد استخدامك في كونسول قاعدة بيانات النار لتجنب ضرب حدود مثل 1 كتاب في الثانية إلى وثيقة واحدة.

خاتمة

وتنفيذ تحديثات البيانات في الوقت الحقيقي في نظام iOS يُحدث مع قاعدة بيانات الإطفاء تحول التفاعلات الثابتة إلى تجارب تعاونية دينامية، وباختيار قاعدة البيانات الصحيحة (معهد معظم المشاريع الجديدة)، وبإنشاء نظام المعلومات الخاص، وباستخدام المستمعين المقطعين، يمكنك أن تبقي تطبيقات تطبيقات تطبيقات البرمجيات المجهزة بمتزامنة مع التغييرات المساندة على الفور تقريبا، ومع ذلك فإن القدرة في الوقت الحقيقي تأتي بمسؤولية:

وللمزيد من القراءة، يستكشفون الوثائق الرسمية [(FLT:0] Firestore documentation] و] Firebase iOS SDK reference. وبالإضافة إلى ذلك، فإن دليل قواعد الأمن Firebase Security Rules guide سيساعدكم على تأمين بياناتكم في الوقت الحقيقي.