Kako stvoriti mostove između okvira u iOS aplikaciji

Ako kôd vaše aplikacije izgleda ovako ...

"Želim izvesti taj dio svoje aplikacije, ali povezan je s ostatkom aplikacije poput tanjura za špagete!"

Pokušaj izvoza malog dijela aplikacije koji je previše ovisan

Kad sam započeo modularizirati dio aplikacije na kojoj sam radio, naletio sam na zid.

Želio sam izvoziti uslugu (u stvari to je bila usluga praćenja) u zaseban okvir. Problem je bio što se ova usluga previše teško vezuje za aplikaciju. Koristila je drugu uslugu koja je i sama koristila drugu duboko usidrenu u aplikaciji.

Da bih izveo uslugu praćenja, morao bih ponovno napraviti faktor i preraditi cijeli set usluga u novom okviru!

Ali činjenica je da nisam imao vremena za to i regresijsko testiranje bilo bi noćna mora, a iz mnogih drugih razloga koje biste mogli imati u bilo kojoj tvrtki (proces, proračun, rok).
Stoga sam morao otkriti kako izvesti ovaj dio svoje aplikacije, a da ne prerađujem sve.

Krenimo od konkretnog primjera!

Evo nas, najbolji način za učenje i razumijevanje kako stvari funkcioniraju je praksa! (Navesti ću Github repo za ovaj primjer na kraju ovog posta)
Dopustite mi da postavim kontekst, imamo malu aplikaciju sa samo 2 ekrana:

  • Početni zaslon
  • Zaslon za plaćanje (taj ekran želimo izvesti u okvir)

Stranica za plaćanje sadrži TextField za unos broja kartice i gumb Pay. Kada pritisnete gumb, plaćanje bi trebalo pokrenuti.
Ali! Izazov leži u načinu plaćanja. Pretpostavimo da jednostavno ne možemo izvoziti uslugu plaćanja iz nekih razloga koje sam evocirao malo ranije.

Početni zaslon i zaslon plaćanja

Dakle, imamo ta dva ekrana, deklarirana u dvije različite mete. Početni zaslon deklariran je u glavnom cilju aplikacije, a zaslon plaćanja deklariran u drugom modulu pod nazivom PaymentModule. Također imamo i PaymentService prijavljenu u glavnom cilju aplikacije kako slijedi:

Način plaćanja je metoda koju ne možemo izdvojiti iz aplikacije, jer je previše ovisna. Ali želimo ga koristiti iz modula za plaćanje.

U modulu Payment imamo definiran PaymentViewController, ako pokušamo nazvati PaymentService, doći će do pogreške jer ova usluga nije u modulu. Ne možete uvesti glavni cilj unutar modula (to bi bila glupost)

Pa kako ćemo koristiti ovu metodu sa PaymentViewController?

Definirajte protokol u modulu

Ovo će biti naš most. Morate definirati protokol u modulu s metodom koja opisuje što želite koristiti u glavnom cilju aplikacije.

Pa definirajmo protokol pod nazivom PaymentServiceProtocol metodom plaćanja:

Implementacija protokola u aplikaciji

Sada moramo reći našoj PayService da se pridržava ovog protokola. Samo trebamo dodati ovo:

"Zašto metoda deklarirana u protokolu nije implementirana u ovo proširenje?"

U pravu ste, kad se podudarate s protokolom morate implementirati njegova svojstva i metode. Trik je u tome što je naziv metode u protokolu potpuno isti kao i ime metode u PaymentServiceu kojeg smo malo ranije objavili. Na taj će način sustav znati da će za pristup protokolskoj metodi morati koristiti metodu plaćanja deklariranu u klasi PaymentService.

Povezivanje dva dijela

Sada moramo spojiti ta dva dijela.
Kada HomeViewController, kada dodirnemo gumb "Idi na stranicu za plaćanje", instanciramo PaymentViewController. Tada ćemo ga proslijediti referencom na ClassService klasu, ali kontroler plaćanja u modulu vidjet će ga kao PaymentServiceProtocol tip.

Evo trika:

Prolazimo PaymentService.self i kod u modulu prikazuje PaymentServiceProtocol.Type.
Od modula sada možemo koristiti način plaćanja definiran u aplikaciji!

Koristeći most

Sada je vrlo jednostavno koristiti most koji smo stvorili:

Metoda didTapPayButton zove se svaki put kada dodirnete gumb Plati (zvuči točno, zar ne?). Provjerite na liniji 23: zovemo način plaćanja na referencu protokola koju smo dobili iz aplikacije.

Budući da se PaymentService podudara s ovim protokolom, sustav će izvršiti kod unutar metode pay, koja je definirana u PaymentService.swift.

Drugim riječima, koristimo metodu koju na početku nismo mogli nazvati iz modula! Most je sada postavljen.

Evo kako to izgleda kada dodirnete gumb za plaćanje.

Korištenje načina plaćanja koji se nalazi u glavnom cilju, od platnog modula

Zaključak

Za zaključak, ova se metoda premošćivanja može koristiti ako želite izvesti komponentu svoje aplikacije u neki okvir.

Ova će vam tehnika omogućiti rezanje rezanci iz zdjele ako ste prisiljeni izvesti taj dio svoje aplikacije u okvir, ali ne možete izvesti cijelu stvar iz bilo kojeg razloga.

Mislim da je ovo privremeno rješenje, prije nego što izbacite cijelu komponentu unutar okvira, kada ćete, primjerice, imati vremena. (U ovom scenariju, jednog dana morat ćete izvoziti način plaćanja unutar modula plaćanja)

Priznajem da u idealnom svijetu, s jednorogama i maštovitim stvarima, ne bismo napravili nešto takvo. Radije bismo izvozili cijelu komponentu, ali kao što sam već puno puta rekao, to nije uvijek moguće.

Github repo ovog projekta možete pronaći ovdje, ne ustručavajte se provjeriti kako je most napravljen i pokušajte sami.
Nadam se da ovaj post može pomoći, slobodno postavite bilo koje pitanje koje imate na umu!

Ova priča objavljena je u najvećoj poduzetničkoj publikaciji The Startup, koju prati +442,678 ljudi.

Pretplatite se za primanje naših najboljih priča ovdje.