Πώς να δημιουργήσετε γέφυρες μεταξύ πλαισίων σε μια εφαρμογή iOS

Αν ο κώδικας της εφαρμογής σας μοιάζει με αυτόν ...

"Θέλω να εξάγω αυτό το μέρος της εφαρμογής μου, αλλά είναι συνδεδεμένο με την υπόλοιπη εφαρμογή σαν σπαγγέτι!"

Προσπαθώντας να εξάγετε ένα μικρό μέρος της εφαρμογής που είναι πολύ εξαρτημένο

Όταν άρχιζα να διαμορφώσω ένα τμήμα της εφαρμογής που δούλευα, έτρεξα σε έναν τοίχο.

Ήθελα να εξάγω μια υπηρεσία (στην πραγματικότητα ήταν η Υπηρεσία Παρακολούθησης) σε ξεχωριστό πλαίσιο. Το πρόβλημα ήταν ότι η υπηρεσία αυτή ήταν πολύ δύσκολα συνδεδεμένη με την εφαρμογή. Χρησιμοποίησε μια άλλη υπηρεσία η οποία με τη σειρά της χρησιμοποιούσε ένα άλλο βαθιά αγκυροβολημένο στην εφαρμογή.

Προκειμένου να εξαγάγω την υπηρεσία παρακολούθησης, θα έπρεπε να επαναπροσδιορίσω και να ξανακάνω ολόκληρο το σύνολο των υπηρεσιών στο νέο πλαίσιο!

Αλλά το γεγονός είναι ότι δεν είχα το χρόνο να το κάνω αυτό και οι δοκιμές παλινδρόμησης θα ήταν ένας εφιάλτης και για πολλούς άλλους λόγους που θα μπορούσατε να έχετε σε οποιαδήποτε επιχείρηση (διαδικασία, προϋπολογισμός, προθεσμία).
Έτσι, έπρεπε να μάθω πώς να εξάγω αυτό το μέρος της εφαρμογής μου χωρίς να επαναδιατυπώνομαι τα πάντα.

Ας ξεκινήσουμε με ένα συγκεκριμένο παράδειγμα!

Εδώ είμαστε, ο καλύτερος τρόπος να μάθουμε και να κατανοήσουμε πώς λειτουργούν τα πράγματα είναι να εξασκηθείτε! (Πρόκειται να παράσχω το repo Github για αυτό το παράδειγμα στο τέλος αυτής της δημοσίευσης)
Επομένως, επιτρέψτε μου να ορίσω το πλαίσιο, έχουμε μια μικρή εφαρμογή με μόνο 2 οθόνες:

  • Αρχική οθόνη
  • Μια οθόνη πληρωμής (θέλουμε να εξάγουμε αυτήν την οθόνη σε ένα πλαίσιο)

Η σελίδα πληρωμής περιέχει ένα TextField για να εισαγάγετε έναν αριθμό κάρτας και ένα κουμπί πληρωμής. Όταν πατάτε το κουμπί, θα πρέπει να ξεκινήσει η πληρωμή.
Αλλά ! Η πρόκληση έγκειται στη μέθοδο πληρωμής. Ας υποθέσουμε ότι απλά δεν μπορούμε να εξάγουμε την υπηρεσία πληρωμών για κάποιους λόγους που προκάλεσαν λίγο παραπάνω.

Αρχική οθόνη και οθόνη πληρωμής

Έχουμε λοιπόν αυτές τις δύο οθόνες, δηλωμένες σε δύο διαφορετικούς στόχους. Η αρχική οθόνη δηλώνεται στον κύριο στόχο εφαρμογής και η οθόνη πληρωμής δηλώνεται σε άλλη ενότητα που ονομάζεται PaymentModule. Έχουμε επίσης δηλώσει το PaymentService στον κύριο στόχο εφαρμογής, ως εξής:

Η μέθοδος πληρωμής είναι η μέθοδος που δεν μπορούμε να εξαγάγουμε από την εφαρμογή επειδή είναι πολύ εξαρτημένη. Αλλά θέλουμε να το χρησιμοποιήσουμε από την ενότητα πληρωμής.

Έχουμε ένα PaymentViewController που ορίζεται στην ενότητα Πληρωμή, αν προσπαθήσουμε να καλέσουμε την PaymentService, θα έχουμε ένα σφάλμα, επειδή αυτή η υπηρεσία δεν είναι στην ενότητα. Δεν μπορείτε να εισαγάγετε τον κύριο στόχο μέσα σε μια ενότητα (που θα ήταν ανόητο)

Πώς λοιπόν θα χρησιμοποιήσουμε αυτή τη μέθοδο από το PaymentViewController;

Ορίστε ένα πρωτόκολλο στη μονάδα

Αυτή θα είναι η γέφυρά μας. Πρέπει να ορίσετε ένα πρωτόκολλο στην ενότητα με μια μέθοδο που περιγράφει τι θέλετε να χρησιμοποιήσετε στον κύριο στόχο εφαρμογής.

Ας ορίσουμε ένα πρωτόκολλο που ονομάζεται PaymentServiceProtocol με μια μέθοδο πληρωμής:

Εφαρμογή του πρωτοκόλλου στην εφαρμογή

Τώρα πρέπει να πούμε στο PaymentService μας να συμμορφώνεται με αυτό το πρωτόκολλο. Απλά πρέπει να προσθέσουμε αυτό το εξής:

"Γιατί η μέθοδος που δηλώνεται στο πρωτόκολλο δεν εφαρμόζεται σε αυτήν την επέκταση;"

Έχετε δίκιο, όταν συμμορφώνεστε με ένα πρωτόκολλο, πρέπει να εφαρμόσετε τις ιδιότητες και τις μεθόδους του. Το κόλπο εδώ είναι ότι το όνομα της μεθόδου στο πρωτόκολλο είναι ακριβώς το ίδιο με το όνομα της μεθόδου στο PaymentService που δηλώσαμε λίγο νωρίτερα. Με αυτόν τον τρόπο, το σύστημα θα γνωρίζει ότι θα πρέπει να χρησιμοποιήσει τη μέθοδο πληρωμής που δηλώθηκε στην κλάση PaymentService κατά την πρόσβαση στη μέθοδο πρωτοκόλλου.

Συνδέοντας τα δύο μέρη

Πρέπει τώρα να ενώσουμε μαζί τα δύο μέρη.
Από το HomeViewController, όταν πατάμε στο κουμπί "Μετάβαση στη σελίδα πληρωμής", κάνουμε παράδοση ενός PaymentViewController. Εκείνη την εποχή, πρόκειται να την μεταβιβάσουμε σε μια αναφορά στην κλάση PaymentService, αλλά ο ελεγκτής πληρωμής στην ενότητα θα το δει ως τύπος PaymentServiceProtocol.

Εδώ είναι το τέχνασμα:

Πέραν της PaymentService.self και ο κώδικας στην ενότητα βλέπει ένα PaymentServiceProtocol.Type.
Τώρα μπορούμε να χρησιμοποιήσουμε την μέθοδο πληρωμής που ορίζεται στην εφαρμογή από την ενότητα!

Χρησιμοποιώντας τη γέφυρα

Είναι πλέον πολύ εύκολο να χρησιμοποιήσετε τη γέφυρα που δημιουργήσαμε:

Η μέθοδος didTapPayButton ονομάζεται κάθε φορά που πατάτε το κουμπί Πληρωμή (ακούγεται σωστό, σωστά;). Ελέγξτε τη γραμμή 23: καλούμε τη μέθοδο πληρωμής στην αναφορά πρωτοκόλλου που λάβαμε από την εφαρμογή.

Καθώς η PaymentService συμμορφώνεται με αυτό το πρωτόκολλο, το σύστημα θα εκτελέσει τον κώδικα μέσα στο pay method, το οποίο ορίζεται στο PaymentService.swift.

Με άλλα λόγια, χρησιμοποιούμε τη μέθοδο που δεν μπορούσαμε να καλέσουμε από την ενότητα στην αρχή! Η γέφυρα είναι τώρα ρυθμισμένη.

Εδώ είναι αυτό που μοιάζει όταν αγγίζετε το πλήκτρο πληρωμής.

Χρησιμοποιώντας τη μέθοδο πληρωμής που περιλαμβάνεται στον κύριο στόχο, από τη μονάδα πληρωμής

συμπέρασμα

Για να ολοκληρώσουμε, αυτή η μέθοδος γεφύρωσης μπορεί να χρησιμοποιηθεί εάν θέλετε να εξάγετε ένα στοιχείο της εφαρμογής σας σε ένα πλαίσιο.

Αυτή η τεχνική θα σας επιτρέψει να κόψετε το noodle από το μπολ, αν είστε αναγκασμένοι να εξαγάγετε αυτό το μέρος της εφαρμογής σας σε ένα πλαίσιο αλλά δεν μπορείτε να εξάγετε ολόκληρο το πράγμα, για οποιοδήποτε λόγο θα μπορούσατε να έχετε.

Νομίζω ότι αυτή είναι μια προσωρινή λύση, πριν βγούμε από το σύνολο του συνόλου μέσα στο πλαίσιο, όταν θα έχετε το χρόνο, για παράδειγμα. (Σε αυτό το σενάριο, κάποια μέρα θα πρέπει να εξάγετε τη μέθοδο πληρωμής στο πλαίσιο της ενότητας Πληρωμή)

Παραδέχομαι ότι σε έναν ιδανικό κόσμο, με μοναξέες και φανταχτερά πράγματα, δεν θα κάναμε κάτι τέτοιο. Θα προτιμούσαμε να εξάγουμε ολόκληρο το στοιχείο, αλλά όπως είπα πολλές φορές, αυτό δεν είναι πάντα δυνατό.

Μπορείτε να βρείτε το Github repo αυτού του έργου εδώ, μη διστάσετε να ελέγξετε πώς γίνεται η γέφυρα και να το δοκιμάσετε μόνοι σας.
Ελπίζω ότι αυτή η ανάρτηση μπορεί να σας βοηθήσει, μη διστάσετε να θέσετε οποιαδήποτε ερώτηση έχετε υπόψη σας!

Αυτή η ιστορία δημοσιεύεται στο The Startup, το μεγαλύτερο δημοσίευμα επιχειρηματικής δραστηριότητας του Medium ακολουθούμενο από +442.678 άτομα.

Εγγραφείτε για να λάβετε τις κορυφαίες ιστορίες μας εδώ.