Kā izveidot tiltus starp ietvariem iOS lietotnē

Ja jūsu lietotnes kods izskatās šādi ...

“Es gribu eksportēt šo savas lietotnes daļu, taču tā ir piesaistīta pārējai lietotnei kā spageti šķīvis!”

Mēģina eksportēt nelielu lietotnes daļu, kas ir pārāk atkarīga

Kad es sāku modulēt to lietotnes daļu, pie kuras strādāju, es ieskrēju sienā.

Es gribēju eksportēt pakalpojumu (patiesībā tas bija izsekošanas pakalpojums) atsevišķā sistēmā. Problēma bija tā, ka šis pakalpojums bija pārāk grūti piesaistīts lietotnei. Tas izmantoja citu pakalpojumu, kas pats izmantoja citu, lietotnē dziļi iestiprinātu.

Lai eksportētu izsekošanas pakalpojumu, man vajadzēja visu pakalpojumu komplektu pārveidot un pārveidot jaunajā ietvarā!

Bet patiesībā man nebija laika to izdarīt, un regresijas pārbaude būtu bijis murgs un daudzu citu iemeslu dēļ, kādi jums varētu būt jebkurā uzņēmumā (process, budžets, termiņš).
Tāpēc man bija jānoskaidro, kā eksportēt šo savas lietotnes daļu, neatkārtojot visu.

Sāksim ar konkrētu piemēru!

Šeit mēs esam, labākais veids, kā mācīties un saprast, kā viss darbojas, ir praktizēt! (Šī sludinājuma beigās sniegšu Github repo par šo piemēru)
Tāpēc ļaujiet man iestatīt kontekstu. Mums ir maza lietotne, kurā ir tikai 2 ekrāni:

  • Sākuma ekrāns
  • Maksājumu ekrāns (mēs vēlamies eksportēt šo ekrānu uz ietvaru)

Maksājumu lapā ir TextField, lai ievadītu kartes numuru, un pogai Pay. Nospiežot pogu, jāuzsāk maksājums.
Bet! Izaicinājums ir saistīts ar maksājuma veidu. Pieņemsim, ka mēs vienkārši nevaram eksportēt maksājumu pakalpojumu dažu iemeslu dēļ, uz kuriem es atsaucos mazliet agrāk.

Sākuma ekrāns un Maksājumu ekrāns

Tātad mums ir šie divi ekrāni, kas ir deklarēti divos dažādos mērķos. Sākuma ekrāns tiek deklarēts galvenajā lietotnes mērķī, un maksājuma ekrāns tiek deklarēts citā modulī, ko sauc par PaymentModule. Mums ir arī PayService, kas deklarēts galvenajā lietotnes mērķī, kā norādīts tālāk.

Algas metode ir metode, kuru mēs nevaram iegūt no lietotnes, jo tā ir pārāk atkarīga. Bet mēs vēlamies to izmantot no maksājuma moduļa.

Maksājuma modulī ir definēts PaymentViewController, ja mēģinām piezvanīt uz PayService, mums radīsies kļūda, jo šis pakalpojums neatrodas modulī. Jūs nevarat importēt galveno mērķi modulī (tas būtu absurds)

Tātad, kā mēs izmantosim šo metodi no PaymentViewController?

Modulī definējiet protokolu

Tas būs mūsu tilts. Modulī jādefinē protokols ar metodi, kas apraksta to, ko vēlaties izmantot galvenajā lietotnes mērķī.

Definēsim protokolu ar nosaukumu PaymentServiceProtocol ar samaksas metodi:

Protokola ieviešana lietotnē

Tagad mums jāinformē mūsu PayService, lai viņi ievērotu šo protokolu. Mums tas tikai jāpievieno:

“Kāpēc protokolā deklarētā metode nav ieviesta šajā paplašinājumā?”

Jums ir taisnība, ka, ievērojot protokolu, jums jāievieš tā īpašības un metodes. Triks ir tas, ka metodes nosaukums protokolā ir tieši tāds pats kā metodes nosaukums PayService, kuru mēs deklarējām mazliet agrāk. Tādā veidā sistēma zinās, ka, piekļūstot protokola metodei, tai būs jāizmanto PayService klasē deklarētā maksājuma metode.

Abu daļu sasaiste

Mums tagad abas daļas ir jāapvieno.
Izmantojot HomeViewController, pieskaroties pogai “Iet uz maksājuma lapu”, mēs uzreiz veicam PayViewController darbību. Tajā laikā mēs tai nodosim atsauci uz PaymentService klasi, bet moduļa maksājumu kontrolieris to redzēs kā PaymentServiceProtocol tipu.

Šeit ir triks:

Mēs nokārtojam PaymentService.self, un moduļa kodā tiek parādīts PaymentServiceProtocol.Type.
Tagad no moduļa mēs varam izmantot zvanīšanas metodi, kas noteikta lietotnē!

Izmantojot tiltu

Tagad ir ļoti viegli izmantot mūsu izveidoto tiltu:

Metode didTapPayButton tiek izsaukta ikreiz, kad pieskaraties pogai Maksāt (izklausās pareizi, vai ne?). Pārbaudiet 23. rindā: mēs izmantojam samaksas metodi, izmantojot protokola atsauci, kuru saņēmām no lietotnes.

Tā kā PaymentService atbilst šim protokolam, sistēma izpildīs kodu maksājuma metodes iekšpusē, kas ir definēta PayService.swift.

Citiem vārdiem sakot, mēs izmantojam metodi, kuru sākumā nevarējām izsaukt no moduļa! Tilts tagad ir uzstādīts.

Lūk, kā tas izskatās, pieskaroties pogai Maksāt.

Izmantojot maksājuma metodi, kas ietverta galvenajā mērķī, no maksājuma moduļa

Secinājums

Noslēgumā jāsaka, ka šo pārejas metodi var izmantot, ja vēlaties eksportēt savas lietotnes komponentu ietvarā.

Šis paņēmiens ļaus jums izgriezt nūdeles no bļodas, ja esat spiests eksportēt šo savas lietotnes daļu uz ietvaru, taču visu iespējamo iemeslu dēļ jūs nevarat eksportēt visu.

Es domāju, ka tas ir pagaidu risinājums, pirms visa komponenta izņemšanas ietvarā, kad jums būs laiks, piemēram. (Šajā scenārijā kādreiz jums būs jāeksportē maksājuma veids maksājuma modulī)

Es atzīstu, ka ideālā pasaulē ar vienradžiem un iedomātām lietām mēs kaut ko tādu nedarītu. Mēs drīzāk eksportētu visu sastāvdaļu, bet, kā es jau daudzkārt teicu, tas ne vienmēr ir iespējams.

Šeit varat atrast šī projekta Github repo, nevilcinieties pārbaudīt, kā tilts tiek veikts, un pats to izmēģināt.
Es ceru, ka šī ziņa var palīdzēt, uzdodiet jebkuru jautājumu, kas jums ir prātā!

Šis stāsts tiek publicēts Medium lielākajā uzņēmējdarbības izdevumā The Startup, kam seko +442 678 cilvēki.

Abonējiet, lai šeit saņemtu mūsu labākos stāstus.