Table of Contents
Κατανόηση των επιλογών αποθήκευσης δεδομένων εκτός σύνδεσης
Η δημιουργία μιας ισχυρής εκτός γραμμής εμπειρίας σε iOS απαιτεί μια προσεκτική επιλογή τοπικών τεχνολογιών αποθήκευσης. Η σωστή επιλογή εξαρτάται από την πολυπλοκότητα των δεδομένων, τις ανάγκες ερωτημάτων και τις απαιτήσεις συγχρονισμού. Τα δεδομένα Core προσφέρουν ένα πλήρες σύστημα διαχείρισης γραφημάτων αντικειμένων με αναίρεση, επικύρωση και ολοκλήρωση με το iCloud συγχρονισμό. Είναι ιδανικά για εφαρμογές με πολύπλοκες σχέσεις και μέτριους όγκους δεδομένων. Για ελαφρές ή απλές ανάγκες βασικής αξίας, Το UserDefaults λειτουργεί καλά αλλά δεν είναι σχεδιασμένο για μεγάλα σύνολα δεδομένων. Το SQLite παρέχει άμεση πρόσβαση σε μια βάση δεδομένων όπως εικόνες ή έγγραφα, το [[AFT] και χρησιμοποιείται συνήθως μέσω του FMDB ή του GRDB wrappers.
Βασικές στρατηγικές για τη διαχείριση δεδομένων εκτός σύνδεσης
Αρχιτεκτονική συγχρονισμού δεδομένων
Οι εφαρμογές εκτός σύνδεσης ⁇ πρώτης iOS πρέπει να καθορίζουν τον τρόπο σύγκλισης της τοπικής και απομακρυσμένης κατάστασης. Ένα δημοφιλές μοτίβο είναι το ]τοπικό ⁇ πρώτο μοντέλο δεδομένων: όλες οι εγγραφές πηγαίνουν πρώτα στην τοπική αποθήκευση, στη συνέχεια ωθούνται στον εξυπηρετητή όταν επιστρέφει η συνδεσιμότητα. Αυτή η προσέγγιση εξασφαλίζει την απόκριση της εφαρμογής ανεξάρτητα από την κατάσταση του δικτύου. Εφαρμογή [[LFT:2]]αλλαγή παρακολούθησης[[[LFT:3] χρησιμοποιώντας χρονοσφραγίδες, αριθμούς ακολουθίας ή διανύσματα έκδοσης για τον εντοπισμό τροποποιήσεων. Όταν συγχρονίζονται, ωθήστε τις τοπικές αλλαγές στον εξυπηρετητή, τραβήξτε απομακρυσμένες αλλαγές και συγχωνεύστε και τις δύο πλευρές. Αποφύγετε τον συγχρονισμό όλων των δεδομένων ταυτόχρονα για μεγάλα σύνολα δεδομένων, χρησιμοποιήστε διαχρονικά ή διαχωρισμένα με βάση δέλτα. Για συγχρονισμό υποβάθρου, μόχλευση URLSession background configurations[FLT5] και [FLT6]]]
Στρατηγικές επίλυσης συγκρούσεων
Όταν τόσο η τοπική όσο και η απομακρυσμένη αλλαγή δεδομένων ανεξάρτητα, προκύπτουν συγκρούσεις. Επιλέξτε μια στρατηγική επίλυσης που να ταιριάζει με την περίπτωση χρήσης σας:
- Τελευταία ⁇ Write ⁇ Wins (LWW): Αποδέχεται την έκδοση με την πιο πρόσφατη χρονοσφραγίδα. Απλό αλλά μπορεί να απορρίψει επεξεργασίες χρήστη.
- Συγχώνευση με αντιγραφή: Για παραγγελθείσες λίστες δεδομένων όπως, συγχωνεύονται οι πράξεις (ενσωματώστε, ενημερώστε, διαγράψτε) χρησιμοποιώντας επιχειρησιακό μετασχηματισμό ή CRDTs.
- Χειρωνακτική Ανάλυση Συγκρούσεων: Παρουσιάστε και τις δύο εκδόσεις στον χρήστη και αφήστε τους να αποφασίσουν.
- Αρχή Server: Ο εξυπηρετητής κερδίζει πάντα μετά από σύγκριση διανυσματικών εκδόσεων. Χρησιμοποιήστε όταν τα δεδομένα του διακομιστή είναι κανονικά.
Καταγράψτε μεταδεδομένα σύγκρουσης (π.χ., " τοπική έκδοση" και "server έκδοση") στο τοπικό σας σχήμα, έτσι ώστε οι χειριστές συγκρούσεων να μπορούν να λάβουν ενημερωμένες αποφάσεις. Δοκιμάστε σενάρια σύγκρουσης με τόσο τις σταγόνες συνδεσιμότητας όσο και τις παράλληλες τροποποιήσεις.
Ευφυής Caching και πρόσβαση δεδομένων
[Flating reduces latency and disk I/O. Implement a multi ⁇ tier cache: in ⁇ memory cache (NSCache or your own) for sυχνά προσπελάσιμα αντικείμενα, και μια επίμονη cache (Core Data or SQLite) για μακροχρόνια αποθήκευση. Για αρχεία εικόνας, χρησιμοποιήστε URLSsion’s in caching ⁇ in caching με κατάλληλες πολιτικές cache (π.χ., [LFT:0]]). Για αρχεία εικόνας, χρησιμοποιήστε τη μόχλευση [[LUT:4]NSCache σε συνδυασμό με μια cache δίσκων (π.χ., Kingfisher ή SDWebImage).Όταν σχεδιάζετε την κρύπτη σας, ορίζετε μια πολιτική έξωσης (LRUT, TL, ή με βάση το μέγεθος) για να αποφύγετε την αδεσμοποίηλιξη. Αποφύγετε να κάνετε χρήση ευαίσθητων δεδομένων
Ακολουθώντας τις αλλαγές χρήστη ⁇ Έναρξη
Όταν ο χρήστης εκτελεί μια λειτουργία εγγραφής ενώ είναι εκτός σύνδεσης, ακολουθεί την ενέργεια σε ένα τοπικό κατάστημα. Μια κοινή προσέγγιση είναι να δημιουργήσετε έναν εν αναμονή πίνακα λειτουργιών[ που καταγράφει τον τύπο λειτουργίας, το τελικό σημείο, το ωφέλιμο φορτίο και την χρονοσφραγίδα. Μόλις συνδεθεί, η εφαρμογή επαναλαμβάνει αυτές τις λειτουργίες κατά σειρά (ή με την επίλυση εξάρτησης).Για να χειριστεί μερικές αποτυχίες, να εφαρμόσει την υποτιμητικότητα[ συνδέοντας μοναδικά UUIDs σε κάθε λειτουργία. Αν μια επανάληψη αποτύχει (π.χ., μια σύγκρουση ή σφάλμα διακομιστή), να επισημάνει την λειτουργία για χειροκίνητη επανεξέταση ή επανεκκίνηση μετά από μια περίοδο υποχώρησης. URL Loading System] παρέχει στιβαρή πρωτόγονη δικτύωση για επαναπροσπάθεια λογική.
Τρόπος εφαρμογής εκτός σύνδεσης σε iOS
Εντοπισμός αλλαγών συνδεσιμότητας
Χρησιμοποιήστε το πλαίσιο δικτύου (NWPathMonitor) ή το παλαιότερο Επιταχυνσιμότητα τάξη για την παρατήρηση μεταβάσεις δικτύου. NWPathMonitor παρέχει μια αντιδραστική ροή της κατάστασης συνδεσιμότητας (Wi ⁇ Fi, κυψελοειδές, ή ethernet). Εγγραφείτε σε ενημερώσεις διαδρομής σε μια ουρά φόντου και δημοσιεύστε μια ειδοποίηση για το στρώμα UI. Για παράδειγμα:
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
let isOnline = path.status == .satisfied
DispatchQueue.main.async {
NotificationCenter.default.post(name: .networkStatusChanged, object: isOnline)
}
}
monitor.start(queue: .global())
Επεκτείνετε αυτό για να διαφοροποιήσετε μεταξύ των ακριβών (κυτταρικών) και των περιορισμένων συνδέσεων ώστε να μπορείτε να αναβάλετε μεγάλους συγχρονισμούς.
Αλλαγή πηγών δεδομένων
Όταν η συνδεσιμότητα πέφτει, η εφαρμογή θα πρέπει να μεταπηδήσει με διαφάνεια από απομακρυσμένες κλήσεις API στην τοπική αποθήκευση. Εφαρμογή ενός στρώμαυ αφαίρεσης πηγής δεδομένων[: ορίσετε ένα πρωτόκολλο (π.χ., ]) με μεθόδους όπως , ] και . Παρέχετε δύο υλοποιήσεις: και . Μια τάξη συντονιστών αποφασίζει ποιον πάροχο να χρησιμοποιήσει με βάση την τρέχουσα κατάσταση δικτύου. Αυτό το μοτίβο διατηρεί το UI συνδεδεμένο σε μια ενιαία διασύνδεση και αποφεύγει τον ψεκασμό σε όλους τους ελεγκτές προβολής. Για τους ακροατές πραγματικού χρόνου, συνδυάζει τοπικές ειδοποιήσεις με απομακρυσμένες ειδοποιήσεις ώθησης για να διατηρήσει τη συνοχή.
Ανατροφοδότηση χρηστών και διαφάνεια
Ενημερώστε τους χρήστες όταν είναι εκτός σύνδεσης και πώς αποθηκεύονται οι ενέργειές τους. Χρησιμοποιήστε [[LFT:0]] τις μπάρες ή τα πανό πλοήγησης συνήθειας[[LPT:1]] για να υποδείξετε κατάσταση εκτός σύνδεσης (π.χ., " Είστε εκτός σύνδεσης. Οι αλλαγές θα συγχρονιστούν όταν συνδέονται."). Εμφάνιση ενός [[LFT:2]δείκτη συγχρονισμού[[LFT:3]] (ρυθμός περιστροφής, γραμμή προόδου) κατά τη διάρκεια συγχρονισμού φόντου. Όταν η αναμονή των αλλαγών, εμφάνιση ενός σήματος στο εικονίδιο συγχρονισμού ή παροχή ενός ειδικού " Εκκρεμή αλλαγών" οθόνη όπου οι χρήστες μπορούν να αναθεωρήσουν και να ακυρώσουν τις λειτουργίες αναμονής. Για αναρτήσεις, να επιδείξετε την πρόοδο ανά ⁇ item αν τα δεδομένα είναι μεγάλα (όπως οι φωτογραφίες). Πάντα να παρέχουν έναν τρόπο για να να ενεργοποιήσετε ένα συγχρονισμό] (e.g., pulltorefresh) έτσι ώστε να μην αισθάνονται οι χρήστες σε λειτουργία.
Δοκιμές και αποσφαλμάτωση σεναρίων εκτός σύνδεσης
Εξομοίωση των συνθηκών δικτύου χρησιμοποιώντας Xcode’s [[LFT:0]]Network Link Conditioner[[LFT:1]] (διατίθεται μέσω των εργαλείων IO Hardware). Δημιουργήστε δοκιμαστικές περιπτώσεις για:
- Απότομη απώλεια συνδεσιμότητας κατά τη διάρκεια μιας λειτουργίας εγγραφής.
- Επανασύνδεση ενώ ενεργοποιούνται πολλαπλές σειρές συγχρονισμού.
- Συγκρούσεις όπου δύο συσκευές τροποποιούν την ίδια εγγραφή εκτός σύνδεσης.
- Μεγάλα δεδομένα συγχρονίζονται σε αργές ή διαλείπουσες συνδέσεις.
- Τερματισμός εφαρμογής μέσα ⁇ συγχρονισμός.
Προσθέστε την καταγραφή για τις μεταβάσεις κατάστασης δικτύου, τις εκλάμψεις ουράς συγχρονισμού και τις αναλύσεις συγκρούσεων. Χρησιμοποιήστε [[LFT:0]]OSLog[] με προσαρμοσμένα υποσυστήματα για την καταγραφή αυτών των γεγονότων στην παραγωγή για θέματα που αφορούν αποσφαλμάτωση χρηστών ⁇ αναφέρθηκαν. Ελέγξτε την αφαίρεση του παρόχου δεδομένων σας με την έγχυση παρόχου pock providers που προσομοιώνουν offline/online καταστάσεις. Για δοκιμές ενσωμάτωσης, χρησιμοποιήστε ένα ειδικό περιβάλλον δοκιμών όπου μπορείτε να προγραμματικά να εναλλάξετε την προσιτότητα του δικτύου μέσω proxies όπως Charles[LFT:3]] ή Network Link Conditioner[[LT:5]]]. Τέλος, τρέξτε XCT[est:7] UI tests που επανειλημμένα εναλλάσσονται για να ενεργοποιήσετε τη λειτουργία αεροπλάνου κατά την εκτέλεση των ροών χρήστη για την αποκάλυψη των συνθηκών της φυλής.
Συμπέρασμα
Η δημιουργία μιας ανθεκτικής εκτός σύνδεσης εμπειρίας στο iOS απαιτεί εσκεμμένες αρχιτεκτονικές αποφάσεις γύρω από την αποθήκευση, τον συγχρονισμό, τον χειρισμό συγκρούσεων και την επικοινωνία των χρηστών. Με τη χρήση δεδομένων Core ή SQLite για δομημένα δεδομένα, την εφαρμογή μιας αφαίρεσης πηγής δεδομένων που αντιδρά σε αλλαγές συνδεσιμότητας και την αναμονή ενεργειών χρήστη για μεταγενέστερο συγχρονισμό, δημιουργείτε μια εφαρμογή που παραμένει πλήρως λειτουργική χωρίς σύνδεση στο διαδίκτυο. Προτεραιότητα στρατηγικές επίλυσης συγκρούσεων που διατηρούν την ακεραιότητα των δεδομένων και κρατούν τον χρήστη ενήμερο για την κατάσταση συγχρονισμού. Η πλήρης δοκιμή με ρεαλιστικές συνθήκες δικτύου θα αποκαλύψει τις περιπτώσεις άκρων νωρίς. Όταν εκτελείται καλά, μια offline ⁇ first προσέγγιση όχι μόνο βελτιώνει την ικανοποίηση των χρηστών αλλά επίσης μειώνει το φορτίο του διακομιστή και την εξάρτηση του δικτύου. Για περαιτέρω ανάγνωση, διερευνήστε τις Οδηγός Προγραμματισμού της Συνέπειας για διαχείριση εργασιών υποβάθρου και URLSsion[FLT3] για προηγμένες τεχνικές δικτύωσης.