Skip to content

Releases: SHcommit/SHCoordinator

[Fix] FlowCoordiantorNavigatable handlePopViewController๋กœ์ง ๊ฐœ์„ 

09 Apr 07:06
Compare
Choose a tag to compare

FlowCoordiantorNavigatable.handlePopViewController(_:didShow:animated:)์˜ ๊ฐœ์„ ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

A Coordiantor์—์„œ presenter = delegate ํ›„ A VC๊ฐ€ dismiss๋  ๋•Œ ์ด ๋กœ์ง์œผ๋กœ coordiantor.finish()๊ฐ€ ํ˜ธ์ถœ๋ฌ๋‹ค๋ฉด,
A Cooridnator์˜ preesnter์—์„œ ๋‹ค๋ฅธ VC๋กœ ์ „ํ™˜ ํ›„ ๋‹ค์‹œ A VC๋กœ๋Œ์•„์˜ฌ๋•Œ๋„ ๋‚ด๋ถ€์— coordiantor.finish๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์ ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

FlowCoordinator ์—์„œ init์ œ๊ฑฐ

29 Oct 07:51
Compare
Choose a tag to compare

FlowCoordinator ์—์„œ init์ œ๊ฑฐ.

์ƒํ™ฉ์—๋”ฐ๋ผ ์ฝ”๋””๋„ค์ดํ„ฐ ์ƒ์„ฑ์‹œ์ ์— ์ถ”๊ฐ€์ ์ธ ๊ฐ’๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•จ. ๋˜๋Š” init(presenter: UINavigationController)๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ณณ๋„ ์žˆ์Œ ex,, ApplicationCoordinator, mainCoordinator

FlowCoordinator protocol์— ๋ถˆํ•„์š”ํ•œ ์„ ์–ธ ์ œ๊ฑฐ

29 Oct 07:27
Compare
Choose a tag to compare

FlowCoordinator protocol์— ๋ถˆํ•„์š”ํ•œ viewController ์„ ์–ธ ์ œ๊ฑฐ

README์— ์—…๋ฐ์ดํŠธ๋œ release ๋ฒ„์ „ ์ถ”๊ฐ€

27 Oct 16:31
Compare
Choose a tag to compare

์š”์•ฝ

๋ฆฌ๋“œ๋ฏธ์— 3.0.x์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ฆด๋ฆฌ์ฆˆ ๋ฒ„์ „ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

3.0.0

27 Oct 16:17
Compare
Choose a tag to compare

๐Ÿ“Œ [์š”์•ฝ]

  • protocol์„ ์ข€ ๋” ์„ธ๋ถ„ํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • finish()์™€ popViewController๋ฅผ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋งค๋ฒˆ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ๋กœ์ง์„ ๋‚ด๋ถ€์— ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
    • finishํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ์— presenter?.popViewController(animated:) ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ popViewController๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด FlowCoordinatorNavigatable ํ”„๋กœํ† ์ฝœ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ์„ธ finish(), popViewController๋ฅผ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋งˆ๋‹ค ์„ ์–ธํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘ ์˜ต์…”๋„ ์—ฐ์‚ฐ์ž ๋Œ€์‹  ์˜ต์…”๋„ ์—ฐ์‚ฐ์ž๋กœ ๋Œ€์ฒด.

๐Ÿ“ธ [์ž‘์—… ๋‚ด์šฉ]

๊ณ ๋ฏผ1: ๋งŒ์•ฝ ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ ๋‚ด๋ถ€์— popViewController๋ฅผ ํ˜ธ์ถœํ•˜๋Š” scope์— popViewController, finish()๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€....

image

๋˜๋Š”

image

์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ๋งค๋ฒˆ finish()์™ธ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ pop ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์ฝ”๋“œ๋ฅผ wrappingํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š”๊ฒฝ์šฐ...

image

๋˜๋Š” ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ deinit์‹œ์  finish()ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ start()๋‚ด๋ถ€์— ์ƒ์„ฑํ•œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฝ”๋””๋„ค์ดํ„ฐ ๋‚ด๋ถ€์— ์ฐธ์กฐํ•  ๊ฒฝ์šฐ, navigationController's popViewController๊ฐ€ ํ˜ธ์ถœ๋˜๋„, ํ•ด๋‹น ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ ์ด์œ ๋Š” ์•„๋ž˜ ๋‚˜์˜ต๋‹ˆ๋‹ค.) ๊ทธ๋ž˜์„œ ๋ฐ˜๋“œ์‹œ( ๋ฌผ๋ก  ๋„ค๋น„์Šคํƒ, ์ฝ”๋””๋„ค์ดํ„ฐ ์ด์™ธ์—๋„ strong reference์ค‘์ธ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”๊ฒฝ์šฐ ์ œ์™ธ) popViewControllerํ˜ธ์ถœ์‹œ์ ์— coordinator.finish()๋ฅผ ํ˜ธ์ถœํ•ด์„œ strong reference๋กœ retatin count๊ฐ€ 2์ธ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ ์ƒ๊ฐํ•œ ๋ฌธ์ œ๋Š”... ๋งŒ์•ฝ baseViewController๋ฅผ ํ†ตํ•ด ์ปค์Šคํ…€ ๋„ค๋น„๋ฐ”๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋’ค๋กœ๊ฐ€๊ธฐ๋ฒ„ํŠผ์„ ์ •์˜ํ–ˆ๋‹ค๋ฉด? ์ด๋•Œ ๋’ค๋กœ๊ฐ€๊ธฐ ์•ก์…˜ํ—จ๋“ค๋Ÿฌ @objc ํ•จ์ˆ˜๊ฐ€ private์ด๋ผ๋ฉด? override๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋ฐฑ ๋ฐ” ๋ฒ„ํŠผ์„ ์ปค์Šคํ…€์œผ๋กœ ๋ถ€์ฐฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ. ์ฆ‰ ์‹œ์Šคํ…œ์—์„œ ์ž๋™์œผ๋กœ ๋ฐฑ ๋ฐ” ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋• ๋”๋”์šฑ ๊ณค๋ž€ํ•ด์ง‘๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด ์•ˆ์—์„œ weak var viewController๋กœ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด์—์„œ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๋Š” ๋Š๋‚Œ๊ณผ ๋™์ผํ•˜๊ฒŒ ์œ ์ผํ•˜๊ฒŒ strong reference์ค‘์ธ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์—์„œ pop๋˜๋ฉด (์™ธ๋ถ€ strong ์ฐธ์กฐ์ค‘์ธ ๊ฐ์ฒด๊ฐ€ ์—†์„ ๊ฒฝ์šฐ) deinit๊ฐ€ ํ˜ธ์ถœ๋˜์ง€๋งŒ....

image

๊ฒฐ๋ก ์ ์œผ๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ๊ธฐ์กด FlowCoordinator์—์„œ ์„ ์–ธํ–ˆ๋˜ finish()๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•œ delegate ํ”„๋กœํ† ์ฝœ์„ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.

image

๊ทธ๋ฆฌ๊ณ  FlowCoordinator์—์„œ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ค€์ˆ˜ํ•œ FlowCoordinatorDelegate ํ•จ์ˆ˜๋“ค์„ extension์œผ๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

finish()์˜ ๊ฒฝ์šฐ ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ finish(withAnimated:)๋ฅผ ์ผ๋‹ค๊ฐ„,, ์ด์ „ ์ด์ „ ํ™”๋ฉด์œผ๋กœ ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‚ฌ๋ผ์งˆ๋•Œ ์ด ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ strong reference๊ฐ€ ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ์— finish()ํ˜ธ์ถœ.

๋งŒ์•ฝ ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ๋„ strong reference์ค‘ ์ด 2๊ฐœ์ธ ๊ฒฝ์šฐ finish(withAnimated:)ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ์ด์ƒ์ธ ๊ฒฝ์šฐ ๋ทฐ strong reference์ค‘์ธ ํด๋กœ์ €๋‚˜ ๊ฐ์ฒด์˜ nil์ด๋‚˜ release๋ฅผ ์‹œ์ผœ์•ผํ•ฉ๋‹ˆ๋‹ค.


๊ณ ๋ฏผ2: UIWindow๋ฅผ ๋‹ค๋ฃจ๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ, viewController๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ, ์ฝ”๋””๋„ค์ดํ„ฐ๋“ค์„ ๋‹ค๋ฃจ๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ ๋“ฑ ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ๋„ ํ•„์ˆ˜์ ์œผ๋กœ viewController ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š”๊ฐ€????

๊ฐ„๋‹จ ์š”์•ฝ ๊ฒฐ๋ก ์ž…๋‹ˆ๋‹ค: ๋งค๋ฒˆ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ deinit์‹œ์ ์ด๋‚˜ popVIewController ํ˜ธ์ถœ sopce์—์„œ coordinator.deinit(), navigationController.popViewController๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

if-tgํŒ€ ios ์„ํ˜„์ดํ˜•๊ณผ release1.0.*๏ฟฝ์˜ FlowCoordinator ํ”„๋กœํ† ์ฝœ์ผ ๋•Œ ๊ฐœ๋ฐœ ์ค‘ ๊ฐ™์ด ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

protocol์—์„œ viewController ํ”„๋กœํผํ‹ฐ { get }๋ฅผ ์„ ์–ธํ•œ๋‹ค๋ฉด ์œ„ ๊ณ ๋ฏผ์ฒ˜๋Ÿผ ๋ถˆํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ์˜ ์„ ์–ธ์ด ๋ฐœ์ƒ๋ฉ๋‹ˆ๋‹ค.....

release 2.0.0์—์„œ viewController ํ”„๋กœํผํ‹ฐ๋ฅผ FlowCoordinator์—์„œ ์ œ๊ฑฐํ–ˆ๋˜ ์ฃผ์š” ์ด์œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๏ฟฝ

์ž ์‹œ ์žŠ๊ณ ์žˆ์—ˆ๋˜... viewController์˜ deinit๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š”์ ์€ ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ ๋ฐฐ์šด์ง€ ์˜ค๋ž˜๋˜์„œ ๊ธฐ์–ต์ด ๊ฐ€๋ฌผ๊ฐ€๋ฌผํ–ˆ์ง€๋งŒ, ์ตœ๊ทผ์— ๋‹ค์‹œ ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ์™„๋ฒฝํ•˜๊ฒŒ ๋– ์˜ฌ๋ ธ๊ณ  ํ•˜๋‹จ์—์„œ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ ์ œ์ผ ์ฃผ์š”ํ–ˆ๋˜ finish()์™€ popViewController๋ฅผ ๋งค๋ฒˆ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•ด๊ฒฐํ•˜๋Š” ์ด๋ฒˆ ๋ฆฌ๋นŒ๋”ฉ ๊ณผ์ •์—์„œ ๋‹ค์‹œ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋˜ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ใ…Žใ…Ž........ ๊ฒฐ๊ตญ protocol๋‚ด๋ถ€์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”.. ๋ถˆํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ ์„ ์–ธ์ด๋‚˜ ํ•จ์ˆ˜๋Š” ๋ถ„ํ•ดํ•˜๋Š”๊ฒŒ ์ข‹์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ๋ฐฐ์› ๋˜ ๊ฒฝํ—˜์„ ์ด ๋– ์˜ฌ๋ž๊ณ  ํ”„๋กœํ† ์ฝœ์„ ๋˜ ์„ธ๋ถ„ํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค +_+

์ด๋ฆ„ํ•˜์—ฌ!!!!!!!!

image

FlowCoordinatorNavigatable protocol!!

์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ finish()๋˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ start()ํ–ˆ๋˜ viewController๊ฐ€ ํ™”๋ฉด์—์„œ ๋”์ด์ƒ ๋ณด์—ฌ์ง€์ง€ ์•Š์„๋•Œ๋„ ๋ฉ”์ธ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ,, ๋งค๋ฒˆ finish(), popVIewController๋ฅผ viewController ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.....

๊ฐœ๋ฐœ์ด ๋ฐ”๋ป์„œ ๊ณ„์† ๋ฏธ๋ฃจ๋‹ค ์˜ค๋Š˜ ์‹œ๊ฐ„๋‚ด์„œ coordiantor ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ง์„ ๊ฐœํŽธํ–ˆ๊ณ  ๊ณ ๋ฏผ2๋ฅผ ํ•ด๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” key๋ผ ์ƒ๊ฐ๋˜์„œ FlowCoordinatorNavigatable์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ณตํ†ต์ ์œผ๋กœ ๋ฐœ์ƒ๋˜๋Š” ์ฝ”๋“œ๋ฅผ protocol Extension์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๊ธฐ ์œ„ํ•œ ๊ณ ๋ฏผ์„ ํ–ˆ๊ณ , ์ด์™€์ค‘์— ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ pop๋ ๋•Œ pop์ค‘์ธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€! transitionCoordinator?.viewController(forKey: .form)์ด ํ•ด๋‹น ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์ธ์ง€ ๋ฉ”ํƒ€ํƒ€์ž…์„ ๋น„๊ตํ•˜๊ฑฐ๋‚˜, strong reference์ค‘์ธ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋กœ์ง์ด FlowCoordinator extension์— ์กด์žฌํ–ˆ์–ด์•ผํ–ˆ์ง€๋งŒ, ์ด๋ฅผ์œ„ํ•ด์„  ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ธ์Šคํ„ด์Šค๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ ๋ฏผ1์ด ๊ฒน์ณค์—ˆ์„ ๋•Œ ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ๋‹ค๋ฃจ๋Š” ์ฃผ์š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ปดํ”Œ๋ฆฌ์…˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์–ด๋–จ์ง€ ๊ณ ๋ฏผํ–ˆ์—ˆ๊ณ ...

image

ํด๋กœ์ € ์ถ”๊ฐ€ ํ›„

image

์ด๋ ‡๊ฒŒ ์‹ค์ œ ์ฝ”๋””๋„ค์ดํ„ฐ ์ƒ์„ฑ์‹œ์ ์— ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ๋‹ค๋ฃจ๋Š” ์ฃผ์š” ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌ์ฒดํƒ€์ž…์„ ๋น„๊ตํ•ด์ฃผ๋Š” ๋กœ์ง์„ ์ž‘์„ฑ๋„ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

image

(๋น„๊ต)

๋˜๋Š” type(of:)๋ฅผ ์จ์„œ ๋น„๊ต๋„ ํ•ด๋ดค์ง€๋งŒ ๊ฒฐ๊ตญ ์ตœ๊ณ ๋กœ ์‰ฌ์šด ๊ฒฝ์šฐ๋Š” ํ”„๋กœํ† ์ฝœ์—์„œ viewController๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ์„ ์–ธํ•ด ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ pop๋ ๋•Œ ํ•ด๋‹น ๋ทฐ๊ฐ€ ์ฝ”๋””๋„ค์ดํ„ฐ์˜ ๋ทฐ์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ๊ฐ€ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค... ๊ทธ๋Ÿฌ๋‚˜ ๊ณ ๋ฏผ1๋กœ ์ธํ•ด ๊ฒฐ๊ตญ ์ƒˆ๋กญ๊ฒŒ ํ”„๋กœํ† ์ฝœ์„ ์„ธ๋ถ„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ธํ•ด ์–ป์„ ์ˆ˜ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ UINavigationControllerDelegate ํ”„๋กœํ† ์ฝœ์—์„œ pop๋ ๋•Œ ๊ด€๋ จ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ์ ์— finish()๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ์ฝ”๋“œ ๋˜ํ•œ viewController ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•ด ์ค„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…์ด ๊ธธ์–ด์ ธ ๊ด€๋ จ ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š”

SHCoordinatorExample -> Source -> Feature -> SubCoordinator์— ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

โœจ[๋ฐœ์ƒํ–ˆ๋˜ ์ด์Šˆ ์ด์ „ release 2.0.0 ๋‹น์‹œ ๋ฌธ์ œ: FlowCoordinator protocol์— ๏ฟฝ viewController: UIViewController๋ฅผ ๋‘ฌ์•ผ ํ•˜๋Š”๊ฐ€?]

์•„๋ž˜๋Š” release 2.0.0 ์ผ ๋•Œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

  protocol FlowCoordinator {
  ...
  var viewController: UIViewController { get }
  ...
}

ACoordinator: FlowCoordinator {
  ...
  let viewController: UIViewController
  ....
}

viewController๋ฅผ FlowCoordinator ํ”„๋กœํผํ‹ฐ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ FlowCoordinator๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด์—์„œ๋Š” persenter(UINavigationController)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค., presenter.viewControllers.last๋ฅผ ํ†ตํ•ด ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ผญ ์ฝ”๋””๋„ค์ดํ„ฐ ๊ตฌํ˜„์ฒด์—์„œ viewController๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋˜์ง€ ์•Š์ง€๋งŒ, protocol ์ค€์ˆ˜๋ฅผ ํ•˜๊ฒŒ๋œ ์ด์ƒ, @objc๋กœ ์˜ต์…”๋„ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ช…์‹œ์ ์œผ๋กœ viewController๋ฅผ ๊ตฌ์ฒดํƒ€์ž…์— ์„ ์–ธํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด์— ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ ์–ธํ–ˆ์„ ๋•Œ, ์žฅ ๋‹จ์ ์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์žฅ์ ์€ viewController ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ๋งŽ์ด ํ™œ์šฉ๋œ๋‹ค๋ฉด ์ •๋ง ์‰ฝ๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ ์€ ๋ทฐ์ปจ ์„ ์–ธ์„ 'weak ' ํ‚ค์›Œ๋“œ๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด? strong reference๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ์‹œ์  ์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ completion handler, combine๋“ฑ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์—์„œ pop๋  ๋•Œ, ํ•ด๋‹น ์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด.finish()๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ deinitํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ์ด ๊ฐ€์ •์€ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ, ์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด ์† ํ”„๋กœํผํ‹ฐ ์ด 2๊ฐœ์˜ strong reference๊ฐ€ ๋ฐœ์ƒ๋  ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์บก์ณ ํ˜•์‹์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋Š” viewController๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ release ๋˜์ง€ ์•Š์„์ˆ˜ ์žˆ๊ณ , memory leak๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.)

ACoordinaotr.start() // AViewController ์ƒ์„ฑ ํ›„ ์‹คํ–‰. ์ด๋•Œ AViewController๊ฐ€ pop๋  ๋•Œ ๋” ์ด์ƒ ACoordiantor ์ธ์Šคํ„ด์Šค๋„ ์œ ์ง€๋  ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ํ•ด์ œํ•ด์•ผ ํ•˜์ง€๋งŒ, ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜ finish()๋ฅผ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผํ•˜๊ณ , ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” AViewController ๋‚ด์—์„œ popViewController(animated:)๋ฅผ ํ˜ธ์ถœ์‹œํ‚ค๋Š” scope๋‚ด์—์„œ ์ž์‹ ์„ ๋‹ค๋ฃจ๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ์˜ finish() ๋˜ํ•œ ํ˜ธ์ถœํ•ด์•ผ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. (์ž˜๋ชปํ•˜๋ฉด ๊นœ๋นกํ•จ..)

์ด๋•Œ๋„ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๊ฒฝ์šฐ

release 2.0.0๊ธฐ์ค€์œผ๋กœ ์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด์—์„œ start()๋‚ด๋ถ€์— ์ƒ์„ฑํ•œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ strong referenceํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ. ์ฆ‰ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์—์„œ ์œ ์ผํ•˜๊ฒŒ ํ•ด๋‹น ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ strong referenceํ•  ๋•Œ

image

popViewController๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ์ด scope์—์„œ coordinator.finish()ํ˜ธ์ถœํ•ด๋„ ๋˜๊ณ ,

์•„๋‹ˆ๋ฉด ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ strong reference๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ

image

deinit์‹œ์ ์— coordinaotr.finish()๋ฅผ ์„ ์–ธํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ ๊ฒฝ์šฐ

์ฝ”๋””๋„ค์ดํ„ฐ ๊ฐ์ฒด์—์„œ ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ์ฒด.start() ๋‚ด๋ถ€์— ์ƒ์„ฑํ•œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด๋‹น ์ฝ”๋””๋„ค์ดํ„ฐ์—์„œ ์ธ์Šคํ„ด์Šค๋กœ ๋ณด์œ ์ค‘์ผ ๋•Œ

์ด๋• popViewController๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์—์„œ, ์ด scope์—์„œ coordinaotr.finish()๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๋งˆ์ €๋„ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ strong reference์ค‘์ผ ๊ฒฝ์šฐ์—”, ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์–ด์žˆ์–ด leak๊ฐ€ ๋ฐœ์ƒ๋ฉ๋‹ˆ๋‹ค. ( ๊ด€๋ จ ์˜ˆ์ œ ํฌ์ŠคํŠธ ๋งํฌ )

์œ„์—์„œ๋ถ€ํ„ฐ ๊ณ„์† ์–ธ๊ธ‰ํ•ด์™”๋˜ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ธฐ์œ„ํ•ด ๊ฒฐ๊ตญ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ๋‹ค์‹œ ํ™œ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

[2.0.0] update FlowCoordinator

18 Sep 06:37
Compare
Choose a tag to compare
  • delete invalid properties
  • append very very very simple example

Version 1.0.2: Updated README with Detailed Changes

29 Jun 18:15
Compare
Choose a tag to compare

First Release SHCoordinator LIbrary ver 1.0.1

29 Jun 06:46
Compare
Choose a tag to compare

First Release SHCoordinator LIbrary

29 Jun 06:01
Compare
Choose a tag to compare

A library that can be easily used when introducing the Coordinator Pattern