

ãããã¯ãŒã¯ããã®ããŒã¿ã®ããŠã³ããŒããç»ååŠçãªã©ã®æéã®ãããã³ãŒããå®è¡ããŠ
iOS
ã¢ããªã±ãŒã·ã§ã³ã®
UI
å¿çæ§ãå®çŸããå Žåã¯ããã«ãã¹ã¬ããã«é¢é£ããé«åºŠãªãã¿ãŒã³ïŒ
oncurrency
ïŒã䜿çšããå¿
èŠããããŸããããã§ãªãå Žåã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒ
U
IïŒå€§å¹
ã«æžéãå§ããå®å
šãªãåçµãã«è³ãããšãããããŸãã
main thread
ãããªãœãŒã¹ãæ¶è²»ããã¿ã¹ã¯ãåé€ããå¿
èŠããããŸãã
main thread
ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒ
UI
ïŒã衚瀺ããã³ãŒããå®è¡ããŸãã
çŸåšã®ããŒãžã§ã³ã®
Swift 3
ããã³æãè¿ã
Swift 4
ïŒ2017幎ç§ïŒã§ã¯ãããã¯ã
Swift
çµã¿èŸŒã¿èšèªã³ã³ã¹ãã©ã¯ãã«ãŸã é¢é£ä»ããããŠããªã2ã€ã®æ¹æ³ã§å®è¡ã§ããŸãããã®å®è£
ã¯ã
Swift 5
ïŒ2018幎æ«ïŒã§ã®ã¿éå§ãããŸãã
ãããã®1ã€ã¯
GCD (Grand Central Dispatch)
ããã
åã®èšäºã¯ããã«å°å¿µããŠããŸãã ãã®èšäºã§ã¯ãOperationæäœã
Operation
æäœãã¥ãŒãªã©ã®æœè±¡çãªæŠå¿µã䜿çšããŠã
iOS
ã¢ããªã±ãŒã·ã§ã³ã§
UI
å¿çæ§ãå®çŸããæ¹æ³ã瀺ããŸãã ãŸããããã2ã€ã®ã¢ãããŒãã®éããšãã©ã®ç¶æ³ã§ã©ã¡ãã䜿çšããã®ãé©åãã瀺ããŸãã
ãã®èšäºã®ã³ãŒãã¯
Githubã§èŠãããšãã§ããŸãã
Operation
ãšã¯
Operation
é©åãªå®çŸ©ã¯ã
NSHipsterã«èšèŒãããŠã
ãŸããOperation
ã¯å®äºããã¿ã¹ã¯ã§ãããæäœã®ç¶æ
ããã®åªå
床ãä»ã®Operations
ããã®äŸåé¢ä¿ãã·ãã¥ã¬ãŒããããã®æäœã管çããããã®ã¹ã¬ããã»ãŒãæ§é ãæäŸããæœè±¡ã¯ã©ã¹ã§ãã
åºæ¬çãªæŠå¿µã Operation
æãåçŽãª
Operation
ã¯ãéåžžã®ã¯ããŒãžã£ã§è¡šãããšãã§ããããã
DispatchQueue
ã§å®è¡ã§ããŸãã ãã ãããã®åœ¢åŒã®æäœã¯ã
addOperation
ã¡ãœããã䜿çšããŠ
OperationQueue
远å ããå Žåã«ã®ã¿é©çšã§ããŸãã
å®å
šãªæäœæäœã¯ã
BlockOperation
ã€ãã·ã£
BlockOperation
ã䜿çšããŠæ§ç¯ã§ããŸãã ç¬èªã®
start ()
ã¡ãœããã䜿çšããŠ
start ()
ãŸãã
åæé¢æ°ã®éåæããŒãžã§ã³ã®ãããªåå©çšå¯èœãªãã®ãååŸãããå Žåã
Operation
ã¯ã©ã¹ã®ã«ã¹ã¿ã
subclass
ãäœæãããã®ã€ã³ã¹ã¿ã³ã¹ãååŸããå¿
èŠããããŸãã
察å¿ãããã£ã«ã¿ãŒã䜿çšããŠãŒãããç»åãååŸãã
FilterOperation
æäœã¯ã
Operation
ã¯ã©ã¹ã®ãŠãŒã¶ãŒ
subclass
ãšããŠå®çŸ©ãããŸãã ãŠãŒã¶ãŒã¯ã©ã¹ã«ã¯ãå
¥åããããã£ãšåºåããããã£ã®äž¡æ¹ãããã³ä»ã®ãã«ããŒé¢æ°ãå«ããããšãã§ããŸãã æäœã®æ©èœéšåã«å¯Ÿå¿ããããã«ã
main ()
ã¡ãœãããåå®çŸ©ïŒ
override
ïŒããŸããã
Operation
ã¯ã©ã¹ã䜿çšãããšã
OperationQueue
æäœãã¥ãŒã§å°æ¥å®è¡ã§ããã¿ã¹ã¯ãäœæã§ããŸãããçŸæç¹ã§ã¯ãä»ã®
Operations
ãããŸã§åŸ
æ©ã§ããŸãã
Operation
ã«ã¯
state mashine
ãããã¯æäœ
Operation
ãã©ã€ããµã€ã¯ã«ãã§ãã

æäœæäœã®å¯èœãªç¶æ
ã¯ã
pending
ïŒä¿çïŒã
ready
ïŒå®è¡æºåå®äºïŒã
executing
ïŒå®è¡æžã¿ïŒã
finished
ïŒå®äºæžã¿ïŒã
cancelled
ïŒç Žæ£æžã¿ïŒã§ãã
Operation
ãäœæããŠ
Operation
ã«é
眮ãããšããæäœã
pending
èšå®ããŸãã ãã°ãããããšã
ready
ç¶æ
ã«ãªãããã€ã§ã
executing
ç¶æ
ã«ç§»è¡ããŠ
OperationQueue
éä¿¡ããŠå®è¡ã§ããŸãã
executing
ç¶æ
ã¯ãããªç§ããæ°å以äžç¶ãããšããããŸãã å®äºåŸã
Operation
ã¯finalç¶æ
ã®
finished
é²ã¿ãŸãã ãã®åçŽãªãã©ã€ãããµã€ã¯ã«ã®ä»»æã®æç¹ã§ãOperationæäœã¯ç Žæ£ããã
cancelled
ç¶æ
ã«ãªããŸãã
Operation
ã¯ã©ã¹
API
ã¯ã
Operation
ãã®ãã©ã€ããµã€ã¯ã«ããåæ ããŠããã以äžã«ç€ºãããŠããŸãã
start()
ã¡ãœããã䜿çšããŠãOperationæäœãå®è¡ããããšãã§ããŸãããã»ãšãã©ã®å Žåã
OperationQueue
æäœãã¥ãŒã«æäœã远å ãããšããã®ãã¥ãŒã¯èªåçã«æäœãéå§ããŸãã
start()
ã䜿çšããŠ
start()
ãããå¥åã®Operationæäœã¯ã
çŸåšã®ã¹ã¬ããã§åæçã«å®è¡ãããããšã«æ³šæããŠãã ããã
çŸåšã®ã¹ã¬ããã®å€éšã§å®è¡ããã«ã¯ã
OperationQueue
ãŸãã¯
DispatchQueue
ã䜿çšããå¿
èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³å
ã®ä»»æã®æç¹ã§ã®Operationæäœã®çŸåšã®ç¶æ
ã¯ãããŒã«ããããã£ã䜿çšããŠç£èŠã§ããŸãïŒ
isReady
ã
isExecuting
ã
isFinished
ã
isCancelled
KVO ïŒ
key-value observation
ïŒã¡ã«ããºã ã䜿çšã
key-value observation
æäœèªäœã¯ã©ã®ã¹ã¬ããã§ãå®è¡ã§ããæãå¿
èŠãªæ
å ±
main thread
ãŸãã¯æäœèªäœãå®è¡ãããã¹ã¬ãã以å€ã®ä»ã®ã¹ã¬ããã§ã
Operationæäœã®æ©èœã远å ããå Žåã¯ã
subclass
Operation
äœæããå¿
èŠããããŸãã æãåçŽãªå Žåããã®
subclass
ã¯ã
Operation
ã¯ã©ã¹ã®
main()
ã¡ãœããããªãŒããŒã©ã€ãããå¿
èŠããããŸãã
Operation
ã¯ã©ã¹èªäœãæäœã®ç¶æ
ã®å€åãèªåçã«å¶åŸ¡ããŸããã以äžã«ç€ºãããè€éãªã±ãŒã¹ã§ã¯ããããæåã§è¡ãå¿
èŠããããŸãã
æäœã«ã¯ãæäœã®å®äºåŸã«å®è¡ããã
completionBlock
ãšã
OperationQueue
ã§ã®æäœã®åªå
床ã«åœ±é¿ãäžããããµãŒãã¹å質ã
qualityOfService
ãæäŸã§ããŸãã
ã芧ã®ãšããã
Operation
ã¯ã©ã¹ã«ã¯
cancel()
ã¡ãœããããããŸããããã®ã¡ãœããã䜿çšãããš
isCancelled
ããããã£ã
true
èšå®ãããã ãã§ãæäœããåé€ããããšããæå³ã¯
subclass
Operation
äœææã«ã®ã¿æ±ºå®ã§ããŸãã ããšãã°ããããã¯ãŒã¯ããããŒã¿ãããŠã³ããŒãããå Žåã
cancel()
ããããã¯ãŒã¯çžäºäœçšããæäœãåæãã
cancel()
å®çŸ©ã§ããŸãã
åºæ¬çãªæŠå¿µã OperationQueue
èªåã§æäœãéå§ãã代ããã«ãOperationQueueãã¥ãŒã䜿çšããŠæäœã管çããŸãã Operation Queue
OperationQueue
ã¯ã远å ã®æ©èœãåãã
DispatchQueue
åªå
床ã®é«ããã©ãããŒããšèŠãªãããšãã§ããŸããå®è¡ãããæäœãç Žæ£ããæ©èœãäŸåããæäœãå®è¡ããæ©èœãªã©ã§ãã
OperationQueue
ã¯ã©ã¹
API
èŠãŠã¿ãŸãããã

ããã§ã¯ã
OperationQueue ()
æäœãã¥ãŒã®æãåçŽãªåæååãšã
OperationQueue ()
ããã³
main
ãã¥ãŒã®çŸåšã®æäœãã¥ãŒã決å®ãã
current
ããã³
main
2ã€ã®ã¯ã©ã¹ããããã£ãåç
§ããŸããããã¯ã
GCD
DispatchQueue.main
ãšåæ§ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒ
UI
ïŒãæŽæ°ããããã«äœ¿çšãããŸã éåžžã«éèŠãªããããã£
maxConcurrentOperationCount
ã¯ããã®ãã¥ãŒã®åææäœã®æ°ãèšå®ãã
1ã«èšå®ãããšãæäœã®é 次ïŒ
serial
ïŒãã¥ãŒã確ç«ããŸãã

ããã©ã«ãã§ã¯ã
maxConcurrentOperationCount
ããããã£ã®å€ã¯
Default
ã«èšå®ãããŸããããã¯ãåææäœã®æå€§å¯èœæ°ãæå³ããŸãã

OperationQueue
æäœïŒãŸãã¯ãã®
subclass
ããããïŒã
Operation
subclass
ãã¯ããŒãžã£ãŒããŸãã¯æäœã®é
åå
šäœã«çŽæ¥è¿œå ããŠã
OperationQueue
é
åå
šäœãå®äºãããŸã§çŸåšã®ã¹ã¬ããããããã¯ããããšãã§ããŸãã
Operation Queue
OperationQueue
ã¯ãåªå
床
qualityOfService
ããæºåå®äºãïŒ
isReady
ããããã£
isReady
true
èšå®ãããŠ
true
ïŒãããã³ä»ã®æäœããã®äŸåé¢ä¿ã«åŸã£ãŠãé
眮ãããæäœãå®è¡ã
true
ã ããããã¹ãŠã®ç¹æ§ãçããå Žåãæäœã¯ãã¥ãŒã«å
¥ããããé åºã§ãå®è¡ãã®ããã«éä¿¡ãããŸãã æäœãæäœãã¥ãŒã«é
眮ããããšããããã®ãã¥ãŒã®ãããã«ãåã³é
眮ã§ããŸããã æäœãå®è¡ãããå Žåãæäœã®ãã¥ãŒã§ç¹°ãè¿ãå®è¡ããããšã¯ã§ããŸãããæäœã¯1åéãã§ãããããã£ãŠã
Operation
ã¯ã©ã¹ã®
subclasses
ãäœæããå¿
èŠã«å¿ããŠäœ¿çšããŠããã®æäœã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸãã
ããšãã°ãã¢ããªã±ãŒã·ã§ã³ãããã¯ã°ã©ãŠã³ãã¢ãŒãã§ãé¢ãããå Žåã
cancellAllOperations ()
ã¡ãœããã䜿çšããŠããã¥ãŒå
ã®ãã¹ãŠã®æäœã«
cancel()
ã¡ãã»ãŒãžãéä¿¡ã§ããŸãã
waitUntilAllOperationsAreFinished()
ã¡ãœããã䜿çšããŠããã®ãã¥ãŒã«å¯Ÿãããã¹ãŠã®æäœãå®äºãããŸã§çŸåšã®ã¹ã¬ããããããã¯ã§ããŸãã ãã ãã
main queue
ãããå®è¡ããªãã§ãã ããã ãã¹ãŠã®æäœãå®äºããåŸã«ã®ã¿äœããè¡ãå¿
èŠãããå Žåã¯ãæäœã®
private
ã·ãªã¢ã«ãã¥ãŒïŒ
serial queue
ïŒãäœæããããã§æäœã®å®äºãåŸ
ã¡ãŸãã
OperationQueueæäœãã¥ãŒã¯
DispatchGroup
ããã«åäœããŸãã
OperationQueue
ã§ããŸããŸãª
qualityOfService
ããŠæäœã远å ã§ããŸãããããã¯åªå
床ã«åŸã£ãŠèµ·åãããŸãã ãŸããæäœãã¥ãŒå
šäœã«å¯ŸããŠ
qualityOfService
ãããé«ãã¬ãã«ã§èšå®ããããšãã§ããŸããããã®å€ã¯åäžæäœã®
qualityOfService
ã®å€ã«ãã£ãŠåå®çŸ©ãããŸãã
OperationQueue
ã®ããã©ã«ãã®
qualityOfService
ã¯
.background
ã§ãã
isSuspended
ããããã£ã
true
èšå®ããŠã
OperationQueue
æäœã忢ããããšãã§ã
true
ã ãã®ãã¥ãŒå
ã®æäœã¯ç¶è¡ãããŸããã
isSuspended
ããããã£ã®å€ã
false
倿ŽãããŸã§ãæ°ãã远å ãããæäœã¯å®è¡ã®ããã«éä¿¡ãããŸããã
isSuspended
ããããã£ã®ããã©ã«ãå€ã¯
false
ã§ãã
Playground
Operationæäœãš
Operation
ãã¥ãŒã§ããã€ãã®å®éšãããŠã¿ãŸãããã
å®éš1. OperationQueue
ãäœæããŠã¯ããŒãžã£ãŒã远å ãã
ã³ãŒãã¯
Githubã® OperationQueue.playground
ã§è¡šç€ºã§ããŸãã
空ã®
printerQueue
äœæã
printerQueue
ã
ã¯ããŒãžã£ãŒã®åœ¢åŒã§æäœã
printerQueue
ã
printerQueue
ã远å ãããšããã«ãæäœã¯çŸåšã®ã¹ã¬ããã«å¯ŸããŠéåæã«éå§ããã
ready
ç¶æ
ã«ãªããŸãã
waitUntilAllOperationsAreFinished()
ã¡ãœããã䜿çšããŠãã¹ãŠã®æäœã®å®è¡æéãæšå®ããŸãããã®ã¡ãœããã¯ãçŸåšã®ã¹ã¬ããã«å¯ŸããŠãåæçã«ãæäœãå®äºãããŸã§åŸ
æ©ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®
main queue
ã§ã¯ããããè¡ããªãæ¹ãè¯ãã§ããã
Playground
ã¯
U
I
Playground
äœãèµ·ããã
Playground
äœè£ããããŸãã 7ã€ã®æäœãã¹ãŠã®åèšå®è¡æéã¯2ç§ããããããã«é·ãã
sleep(2)
æŒç®åã®å®è¡æéã«å¯Ÿå¿ããããã
printerQueue
ã¯å€ãã®ã¹ã¬ããã§7ã€ã®æäœãã¹ãŠãåæã«éå§ããŸãã
printerQueue
ãã¥ãŒ
printerQueue
倿Žãã
maxConcurrentOperationCount
ããããã£ã
2ã«èšå®ããŸãããã

ãã¢ã§éå§ããæåŸã®7çªç®ã®æäœã4çªç®ã®ããã¢ãã®1ã€ãéå§ããããããã¹ãŠã®æäœã
printerQueue
ã«çœ®ãã®ã«éåžžã«çãæéããããããã¹ãŠã®æäœãå®äºããã®ã«8ç§åŒ·ããããŸãã
次ã«ã
qualityOfService
ã
.userInitiated
å¢ãããå¥ã®
concatenationOperation
æäœã远å ã
.userInitiated
ã

æåã®æ©äŒã«ãåªå
床ã®é«ãæäœãä»ã®æäœãããæ©ãå®è¡ãããŸããããã¹ãŠã®æäœã®åèšå®è¡æéã¯å®è³ªçã«å€ãããªããŸãŸã§ã8ç§åŒ·ã§ãã
maxConcurrentOperationCount
ããããã£ã
1ã«èšå®ããŠã
maxConcurrentOperationCount
serial
maxConcurrentOperationCount
ãŸãããã

ãã®å Žåãæäœã¯é çªã«å®è¡ãããåªå
é äœãæ©èœããããã¹ãŠã®æäœã®åèšå®è¡æéã
16ç§ã«å¢å ããããšãããããŸãã
ãã£ã«ã¿ãŒåŠçããããœãŒã¹ç»åã®é
åãååŸããå Žåãããè€éãªã±ãŒã¹ãæ€èš

åã®ã»ã¯ã·ã§ã³ã§ããªãã¿ã®ã«ã¹ã¿ã
FilterOperation
æäœã䜿çšãããŸãã

ãã£ã«ã¿ãŒæäœçšã®
filterQueue
ããã£ã«ã¿ãŒåŠçãããã€ã¡ãŒãžãé
åã«è¿œå ããã¹ã¬ããã»ãŒãçšã®
appendQueue
ã·ãŒã±ã³ã·ã£ã«ïŒ
serial
ïŒãã¥ãŒãäœæããŸãã å®éã«ã¯ãå€ãã®ãã£ã«ã¿ãªã³ã°æäœã
shared
ãªãœãŒã¹ïŒ
filteredImages
é
åïŒã«åæã«ã¢ã¯ã»ã¹ããŠãèŠçŽ ã远å ããŸãã èŠããŠãïŒ
shared
ãªãœãŒã¹ã倿Žããããã«
serial
DispatchQueue
ãã¥ãŒã䜿çšããŸãããïŒ ãããåãã§ããã
Operation
ã«å¯ŸããŠå®è¡ãããŸãã ãã¡ãããã·ãªã¢ã«ïŒ
serial
ïŒ
DispatchQueue
ãã¥ãŒã®æ¹ãå¹ççã§ãããã·ãªã¢ã«ïŒ
serial
ïŒ
OperatioQueue
ãã¥ãŒã®äœæãšäœ¿çšã瀺ããŸãã
Swift
é
åã¯
value type
ãããã³ããŒæã«ã³ããŒïŒ
copy on write
ïŒãããããããã«ãã¹ã¬ããã®å€æŽã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸããããç¹ã«é
åãåã¯ã©ã¹ã®ãªããžã§ã¯ãã®ããããã£ã§ããå Žåãããã«åé¡ããããã©ããã«ã€ããŠãã©ãŒã©ã ã«ã¡ãã»ãŒãžããããŸãã ãããã£ãŠãç°ãªãã¹ã¬ããã§æ°ããèŠçŽ ã远å ãããšãã«
thread safe
é
åãä¿æããæ¹æ³ã瀺ããŸãã

次ã«ãåç»åã®ãã£ã«ã¿ãªã³ã°æäœãäœæããéåæå®è¡ã®ããã«
filterQueue
ã«è¿œå ããŸãã ãã£ã«ã¿ãŒåŠçãå®äºããããçµæã®ã€ã¡ãŒãžã
filteredImages
é
åã«è¿œå ãã
completionBlock
ã§
appendQueue
ãŸããããã§å¥ã®æäœãã¥ãŒ
appendQueue
ã䜿çšããŸãã
completionBlock
å
¥åãã©ã¡ãŒã¿ãŒ
completionBlock
ãªããäœãè¿ããŸããã
ãã¹ãŠã®ãã£ã«ã¿ãªã³ã°æäœãå®äºããã®ãåŸ
ã£ãŠããã£ã«ã¿ãªã³ã°ãããç»åé
åã確èªããŸãã

ãã¹ãŠã®æäœã®å®è¡æéã¯
1.19ç§ã§ããããã¯ã1ã€ã®æäœïŒåã®ã»ã¯ã·ã§ã³ãåç
§ïŒã®å®è¡æéã«å¹æµããŸãã
filterQueue
ã
filterQueue
ãã¥ãŒã§æäœã®ãã«ãã¹ã¬ããå®è¡ãè¡ãããŸãã
Playground
ã¯ããã£ã«ã¿ãªã³ã°ãããç»åã®é
åã衚瀺ãããŸããããã£ã«ã¿ãªã³ã°å¹æãèŠãã«ã¯éåžžã«å°ããã§ãã ã¯ã€ãã¯ãã¥ãŒãã¿ã³ãã¯ãªãã¯ããŠããã£ã«ã¿ãªã³ã°å¹æã確èªã§ããŸãã

éåææäœ
ã³ãŒãã¯
Githubã® AsyncOperations.playground
ã§è¡šç€ºã§ããŸãã
ãããŸã§ã®ãšãããSYNCHRONOUSã¿ã¹ã¯ã®æäœãã€ãŸãçŸåšã®ã¹ã¬ããã䜿çšããã¿ã¹ã¯ãå®äºãããŸã§æ»ããªã颿°ã䜿çšããŸããã ASYNCHRONã®ã¿ã¹ã¯ïŒé¢æ°ïŒã¯ãŸã£ããç°ãªãæ¹æ³ã§åäœããŸãïŒçŸåšã®ã¹ã¬ããã§ããã«å¶åŸ¡ãè¿ããå¥ã®ã¹ã¬ããã§ã¿ã¹ã¯ãå®è¡ããã¿ã¹ã¯ãå®äºããããšãç¥ããããããä»ã®ã¹ã¬ããã§
completionHandler
ãéããããŸãã å
žåçãªäŸã¯
URLSession
ã§ãïŒ

Operationæäœã§
URLSession
ã®æ©èœããã©ãããã§ããŸãããæäœã®ã¹ããŒã¿ã¹ãæåã§å¶åŸ¡ããå¿
èŠããããŸãã
SYNCHRONOUS颿°ã®ã«ã¹ã¿ã æäœãäœæããã«ã¯ãæäœã¡ãœãã
main()
ããªãŒããŒã©ã€ãããã ãã§æžã¿ãŸããã ASYNCHRON颿°ã§ãŸã£ããåãããšãè¡ãå Žåã
main()
ã§ããã«å¶åŸ¡ãçŸåšã®ã¹ã¬ããã«æ»ããå¥ã®ã¹ã¬ããã§åäœããããã«ãè±éããã
main()
ã¡ãœããã®æåŸã«ç§»åãã
OperationQueue
ããã«
OperationQueue
ãã¥ãŒãããã¹ããŒãããŸãã ASYNCHRONæ©èœãå®äºããããšã¯ãããŸããã ããã
OperationQueue
èåŸã«ããããžãã¯ã§ãã
éåææäœã«ã¯ããŸã£ããç°ãªãäœæ¥ããžãã¯ããããŸãã

æäœããæºåå®äºãïŒ
isReady = true
ïŒã®å ŽåãOperationQueueæäœãã¥ãŒã¯
start()
ã¡ãœãããåŒã³åºããŸãããã®ã¡ãœããã§ã¯ãæäœããrunningãç¶æ
ïŒ
isExecuting = true
ïŒã«èšå®ãã
main()
ã¡ãœãããåŒã³åºããŸãããã®ã¡ãœããã¯ASYNCHRON颿°ãåŒã³åºããŸãã ASYNCHRON颿°ã¯ANOTHERã¹ã¬ããã§äœããè¡ããŸããã
isExecuting
ããããã£ã¯ãCURRENTã¹ã¬ããã§äœãè¡ãããå¥ã®ã¹ã¬ããã§å®è¡ãããŠããã¿ã¹ã¯ã®ã¿ã衚ãå Žåã§ã
true
ãŸãŸã§ãªããã°ãªããŸããã ASYNCHRON颿°ãASYNCHRON颿°ã®
completionHandler
ã瀺ã
completionHandler
åŒã³åºãå Žåã
completionHandler
ããããã£
isFinished
ã
true
ã«ã
isExecuting
ããããã£ã
false
èšå®ããå¿
èŠããã
false
ã
ãããã£ãŠãASYNCHRONæäœã®å Žåã
main()
ã¡ãœãã以äžã®ãã®ããªãŒããŒã©ã€ãããå¿
èŠããããŸãã æ¬¡ã®ã¡ãœãããšããããã£ããªãŒããŒã©ã€ãããå¿
èŠããããŸãã

Operation
ããç¶æ¿ãããASYNCHRONOUSæäœã®å®è¡ã«é©ããæœè±¡ã«ã¹ã¿ã ã¯ã©ã¹
AsyncOperaton
äœæããŸãããã ãã®æœè±¡æ§ã¯ãéåææäœãå®è¡ãã
main()
ã¡ãœããããªãããšã§ãã 圌ã®å³ã¯æ¬¡ã®ãšããã§ãã
OperationQueue
ãªãã§èªåã§ASYNCHRONOUSæäœã䜿çšããå Žåã
isAsynchronous
ããããã£ããªãŒããŒã©ã€ãããŠ
true
ãè¿ãå¿
èŠããããŸãã ASYNCHRON颿°ãå®éã«éå§ãã
isExecuting
ããããã£ã
true
ä¿ã€ã«ã¯ã
start()
ã¡ãœããããªãŒããŒã©ã€ãããå¿
èŠããããŸãã ãŸããæäœã®ç¶æ
ãæ±ºå®ããããããã£
isReady
ã
isExecuting
ã
isFinished
ã管çããæ¹æ³ãåŠã¶å¿
èŠããããŸãã ãããã®ããããã£ã¯ã
OperationQueue
æäœãã¥ãŒã«ãã£ãŠäœ¿çšããã
OperationQueue
ã®ã¹ããŒã¿ã¹ãç£èŠããäŸåããæäœã®å®è¡ãæŽçããŸãã
æäœéã®äŸåé¢ä¿ãå®çŸ©ããå Žåã1ã€ã®æäœãå¥ã®æäœãéå§ããåã«çµäºããå¿
èŠãããããã
OperationQueue
æäœãã¥ãŒã¯ãæäœããã€çµäºããããç¥ãããšãéèŠã§ãã SYNCHRONOUSæäœã®å ŽåãSYNCHRONOUSæ©èœãçµäºãããšSYNCHRONOUSæäœãçµäºãããããããã¯åé¡ã§ã¯ãããŸããã ãã ããASYNCHRON颿°ã¯çŸåšã®ã¹ã¬ããã®å€åŽã§çµäºãããããASYNCHRON颿°ã®å®éã®çµäºã«ã€ããŠ
OperationQueue
æäœãã¥ãŒã«éç¥ããæ¹æ³ãå¿
èŠã§ãã
GCD
ãæãåºããšãASYNCHRONOUS颿°ãã°ã«ãŒãã«è¿œå ãããšãã«ã
enter()
ããã³
leave()
ã¡ãœããã䜿çšããŠãASYNCHRONO颿°ã®éå§ãšçµäºãæç¢ºã«ç€ºããŸããã ãã ããOperationæäœã®å Žåãæäœã«ã¯
isReady
ã
isExecuting
ã
isFinished
ã
isCancelled
ãªã©ã®ç¶æ
ããããããç¶æ³ã¯ã¯ããã«è€éã§ã
isReady
颿°ãOperationæäœã«è¿œå ããå Žåããããã®ç¶æ
ãæåã§ç®¡çããå¿
èŠããããŸãã ãã®äœæ¥ã容æã«ããããã«ã
AsyncOperaton
ãšããååã®
Operation
ã¯ã©ã¹ã®ç¹å¥ãªæœè±¡ãŠãŒã¶ãŒ
subclass
ãäœæããŸããããã®äž»ãªã¿ã¹ã¯ã¯ãæäœã®ç¶æ
ã®å€æŽãå¶åŸ¡ããããšã§ãã ç¬èªã®ASYNCHRON颿°ã®å Žå
subclass
ã¯ã©ã¹ã®
subclass
äœæããããããASYNCHRON颿°ãåŒã³åºã
main ()
ã®ã¿ãå®çŸ©ããŸãã ãããŠããã§ã«ãã®æ°ããæäœã¯
OperatonQueue
ã«è¿œå ãã
OperatonQueue
ã
ãã ããåé¡ã¯ãããšãã°ãæäœã®ç¶æ
ã«é¢é£ãããã¹ãŠã®ããããã£
isReady
ã
isExecuting
ã
isFinished
ã
readonly
ïŒ
{get}
ïŒã§ãããçŽæ¥èšå®ã§ããªãããã
isExecuting = true
èšè¿°ã§ããªãããš
{get}
ã
AsyncOperaton
æäœã®ã¹ããŒã¿ã¹
AsyncOperaton
倿Žãããããšãã·ã¹ãã ã«éç¥ããªããã
isExecuting
ããããã£ã
true
è¿ãããã«ããããšããã§ããŸããã
Operation
ã¯ã©ã¹ã¯ã
KVO ïŒ
key-value observation
ïŒã¡ã«ããºã ãš
willChangeValueForKe
ããã³
didChangeValueForKey
ã
isReady
ã
isExecuting
ã
isFinished
ã
isExecuting
ãªã©ã®ç¶æ
ããããã£ã®å€æŽã«ã€ããŠéç¥ããŸãã
ãããã£ãŠãè³ç£ç®¡çæ¥åã®äŸ¿å®ã®ããã«ãç§ãã¡ã¯ãæ°ããããŒã¿åãäœæããŸã-é©åãªåæenum State
éåææäœç¬èªã®å€çš®ã®ç¶æ
ã衚ãããã«ïŒready
ãexecuting
ãfinished
ãåæState
ã«ã¯ãKVOéç¥ã®ã¹ã€ãããšããŠäœ¿çšfileprivate
ããååã®ããããã£ãå«ãŸããŸããããããã£ã¯èšç®ããã倧æåã®åæèŠçŽ ã®ååã§ããã«æ¥ç¶ãããæååã§æ§æãããŸããæ¬¡ã«ãæœè±¡ã¯ã©ã¹ã§æäœã®çŸåšã®ç¶æ
ã衚ãå倿°ãå®çŸ©ããŸããããã©ã«ãã§ã¯ããã®å€ã¯equal ã§ãã倿°ã倿Žãããã³ã«ãKVOéç¥ãåãæ¿ããå¿
èŠããããŸãããããè¡ãã«ã¯ããªãã¶ãŒããŒãšããããã£ã䜿çšããŸããkeyPath
keyPath
"is"
rawValue
State
AsyncOperaton
var state
State
ready
state
willSet {}
didSet {}
state
state
ããšãã°ãããexecuting
ã«æäœç¶æ
ãåãæ¿ããåã«ãäž¡æ¹ã®æäœã®æ°ããç¶æ
ïŒïŒãšçŸåšã®ç¶æ
ïŒïŒã«ã€ããŠKVOéç¥finished
ãéä¿¡ããå¿
èŠããããŸããåãæ¿ãæ¡ä»¶ãåŸã«çºçãããæã
ã¯éä¿¡KVOã®éç¥ãããããã«äž¡æ¹ã®æ¡ä»¶ïŒïŒïŒãšïŒïŒãããã¯ãã·ã¹ãã ãæ°ããå€ããã€ãã£ããã®ç¶æ
倿°ã®èªã¿åºãåäœãããããã«ãªããŸãããããã®ãããéåææäœæã
ã¯ããã€ãã£ããç¶æ
倿°ã®æäœãåå®çŸ©ããå¿
èŠãããããwillChangeValue
newValue
finished
state
executing
state
didChangeValue
keyPath
oldValue
executing
state
finished
isReady
isExecuting
isFinished
AsyncOperation
isReady
isExecuting
isFinished
state
æ£ããå€ãè¿ãèšç®å€æ°ãšããŠæ°ããããããã£ã䜿çšããŸãããããextension
ã¯ã©ã¹æ¡åŒµã§è¡ãAsyncOperation
ãŸãïŒããæç¹ã§ãæäœã®ããããã£isReady
ãçãããªãtrue
ãããããã£isReady
forã䜿çšããå¿
èŠããããŸããããã¯ãä»ã®æäœsuperclass
ãžã®äŸåæ§ïŒdependencies
ïŒããç¥èŠãããŸããç¬èªã®ããžãã¯ãšã®ããããã£isReady
ãçµã¿åãããsuperclass
ããšã§ãæäœãæ¬åœã«ãæºåå®äºãã§ããããšã確èªã§ããŸããæ³šå€æ°ãããã°ããstate
ã§.finished
ãã®ããããã£superclass
isFinished
ãšåãtrue
ããšããããã£isExecuting
- false
ããŸãã2ã€ã®ã¡ãœãããisAsynchronous
è¿ãããšã§ããããã£ãåå®çŸ©ããŸãtrue
ïŒstart()
ãšcancell()
ãã¡ãœããã§start()
ã¯ãæäœãç Žæ£ãããŠãããã©ãããã€ãŸãããããã£isCancelled
ãequalã§ãããã©ããã確èªããŸãtrue
ããã®å Žåã倿°ã«æ°ããå€ãèšå®ããå¿
èŠããããŸãstate
- .finished
ãæäœãç Žæ£ãããªãå ŽåããåŒã³åºããŸãmain()
ãããã¯èŠããŠããmain()
éåæé¢æ°ã§ãããããã¯ããã«æ»ããŸãã®ã§ãæã
ã¯æåæäœã®ç¶æ³ãèšå®ããå¿
èŠãstat
åãã§ã.executing
ã ASYNCHRON颿°ãæ»ããšããcompletionHanller
æäœã®ç¶æ
ãèšå®ããªããã°ãªããŸãã.finished
ã ASYNCHRON颿°ã®å Žåãstart()
ã¡ãœããã§superclass
-ã®åæ§ã®ã¡ãœããã®åŒã³åºãã䜿çšã§ããªãããšãèŠããŠããããšãéåžžã«éèŠã§ããããã¯super.start()
ã颿°ã®åæèµ·åãæå³ããmain()
æ£å察ãå¿
èŠã ããã§ãããã®ã¡ãœããã§cancell()
ã¯ãæäœã®ç¶æ
ãèšå®ããå¿
èŠããããŸã.finished
ããã®çµæãæœè±¡ã¯ã©ã¹ãååŸããŸããAsyncOperation
ãç¬èªã®éåææäœã«äœ¿çšã§ããŸãããããè¡ãã«ã¯ãæ¬¡ã®æé ãå®è¡ããŸããäŸãšããŠãsleep (1)
2ã€ã®æ°å€ã®éåæäœéïŒå
éšã«ããïŒå ç®ã®æ©èœã䜿çšããŸããAsyncOperation
as ã䜿çšããŠsuperclass
ãåå®çŸ©main ()
ããæäœç¶æ
state
ã.finished
in ã«èšå®ããããšãå¿ããªãã§callback
ãã ããïŒcallback
ãªã¿ãŒã³ã®çµæresult
ãæã
ã¯ããããã£æäœå²ãåœãŠãself.result
ããã³ã»ããåäœç¶æ
ã®state
æã«.finished
ããšãéç¥çªå·ã®éåææ·»å çµäºã®ãã¹ãŠã®æäœãããŠããã¯ããã®æäœã§äœæ¥ããå¿
èŠããããŸããã䜿çšããŠSumOperation
ãæ°å€ã®ãã¢ã®åèšã®é
åãååŸããŸããæ°å€ã®ãã¢ããšSumOperation
ã«ãadditionQueue
éåžžã®æ¹æ³ã§æäœãäœæããæäœã®ãã¥ãŒã«é
眮ããŸãéåææäœã®é åºã¯ãé
åå
ã®æ°å€ã®ãã¢ã®é åºãšã¯ãããã«ç°ãªãããšãããããŸããããã¯ãéåææäœã®ãã«ãã¹ã¬ããå®è¡ã瀺ããŠããŸãã第äºã®äŸã¯ãäžããããç»åã®éåæããŒãã£ã³ã°ã«é¢ããURL
ä»ãURLSession
ïŒ
éåæåäœäœæImageLoadOperation
ååã®ããã«ã¯ã©ã¹ã®ãµãã¯ã©ã¹ã§ããã AsyncOperation
ãæäœã«ã€ããŠã¯ImageLoadOperation
ãååã®ããã«ãåå®çŸ©main ()
ãããã³æäœã®ã¹ããŒã¿ã¹ãèšå®ããããšãå¿ããªãã§ãã ããstate
äž.finished
ã§completion
ïŒ
æäœãäœæãoperationLoad
ãç»åãååŸoperationLoad.outputImage
ããäžã«è¡šç€ºview
ïŒ
ã³ãŒãã¯ãäžã§é²èЧããããšãã§ããŸãAsyncOperations.playground
ã§ã®GithubãäŸåé¢ä¿ïŒdependencies
ïŒ
ã³ãŒãã¯Githubã® LoadAndFilter.playgroundã§è¡šç€ºã§ããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ã1ã€ã®æäœã®çµæãå¥ã®æäœã«è»¢éããæåã®æäœãçµäºãããšãã«ã®ã¿2çªç®ã®æäœã匷å¶çã«éå§ããæ¹æ³ãæ€èšããŸãã
å³ã§ã¯ã2ã€ã®æäœã衚瀺ãããŸãã1ã€ç®ã¯ãããã¯ãŒã¯ããç»åãèªã¿èŸŒã¿ã2ã€ç®ã¯ç»åã®äžéšãšäžéšã®ããã©ã®ã³ã°ããå®è¡ããŸã-ãã£ã«ã¿ãªã³ã°ããããã®æäœã¯äž¡æ¹ãšãçžäºã«éåžžã«ããŸãæ©èœããŸããã€ã¡ãŒãžã®ãããŠã³ããŒããŒãã¯ãã®ããŒã¿ãããã£ã«ã¿ãŒãã«çŽæ¥è»¢éããŸãããããã®äž¡æ¹ã®æäœãå«ã1ã€ã®æäœãäœæã§ããŸãããããã¯éåžžã«æè»ãªèšèšã§ã¯ãããŸããã
ã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªå Žæã§ã€ã¡ãŒãžãä»»æã®é åºã§äœ¿çšããããã«ãã€ã¡ãŒãžãæäœããéã«ãæäœã®ã¢ãžã¥ãŒã«æ§ãããçšåºŠç¢ºä¿ããããšãæãŸããã§ããããæè»ãªãœãªã¥ãŒã·ã§ã³ã¯ãæåã®æäœãã2çªç®ã®æäœãžã®ã€ã¡ãŒãžã®è»¢éã䌎ãæäœã®ããã§ãŒã³ãã®å®è£
ã«é¢é£ä»ããããŠããŸãã ããã£ã«ã¿ãŒãã¯ãããŒããŒãã«äŸåããŠãããšå€æã§ããæäœã®ãã¥ãŒã¯OperationQueue
ãããã£ã«ã¿ãŒããready
ãããŒããŒãã®çµäºåŸã«ã®ã¿ç¶æ
ã«èšå®ãããããšãèªèããŸããããã¯æ¬åœã«æäœãã¥ãŒã®ãã°ããããèœåãã§ãOperationQueue
ã ãäŸåé¢ä¿ãã®éåžžã«è€éãªã°ã©ããäœæããŠãOperationQueue
å¿
èŠã«å¿ããŠèªåçã«æäœãéå§ããããšãã§ããŸãããäŸåé¢ä¿ãã®åŠçããµããŒãAPI
ããã¯ã©ã¹Operation
ïŒdependencies
ïŒ-éåžžã«ã·ã³ãã«ã§ãããæäœäžã«çŽ æŽãããåãçºèŠããŸãã
ãäŸåé¢ä¿ãïŒdependency
ïŒã远å ããã³åé€ãããdependencies
ããã®æäœã«è¿œå ããããäŸåé¢ä¿ãã®ãªã¹ããååŸãããã§ããŸãã以äžã§ã¯ããªã¹ãdependencies
ã䜿çšããŠãäŸåãã£ã«ã¿ãªã³ã°æäœã®å
¥åç»åãååŸããŸããäŸåé¢ä¿ãäœæãããšããããããã¯ïŒdeadlockïŒãçºçããå¯èœæ§ãé«ããªã
ãŸãããäŸåé¢ä¿ãåã«éããã«ãŒããçŸãããšããããããã¯ãçºçããèŠèŠçãªåæã«ãã£ãŠç¹å®ãã以å€ã«ãããããæé€ããæ®éçãªæ¹æ³ã¯ãããŸãããæäœã®ãäŸåæ§ãã«é¢é£ããæ¬¡ã®åé¡ã¯ããäŸåæ§ãã§ãŒã³ãã«æ²¿ã£ãŠããŒã¿ã転éããæ¹æ³ã§ããããšãã°ãäžèšã®äŸã§ã¯ããããŒããŒããæåã«æ©èœããæ¬¡ã«ããã£ã«ã¿ãŒããæ©èœããå Žåãå
¥åã€ã¡ãŒãžã¯ãããŒããŒãã®åºåã€ã¡ãŒãžã«ãªããŸãããããã©ã®ããã«éæããŸããïŒãã®ImagePass
å Žåãå¿
èŠãªããŒã¿ãæäŸãããããã³ã«ãäœæããŸãUIImage?
ïŒ
ããŒããŒã -ãã§ã«ããªãã¿ã®ã¯ã©ã¹ã®ImageLoadOperation
圌ã¯äžããããå
¥ãå£ã«ã¯ãããã¯ãŒã¯ã®ã€ã¡ãŒãžããŒãæäœãURL
æååãªã©ã®ç»åurlString
ãããã³åºå-ã€ã¡ãŒãžãã®ãã®outputImage
ã
ã¯ã©ã¹ImageLoadOperation
ã確èªããããã³ã«ImagePass
ãšãããã³ã«ã®ç¹æ§ãè¿ãimage
åºåã¯ç»åãèªã¿èŸŒãŸoutputImage
ãã¿ãŒã³ã§ã¯ãæäœããã£ã«ã¿ãªã³ã°ã -ã¯ã©ã¹ãFilterOperation
-å
¥åç»åãååšããªãå Žåã«ã¯ã_inputImage
äŸåæ§ã®ç¢ºèªããdependencies
ãšã ã人ã
ã«èå³ãæã£ãŠããã確èªãã¬ããŒãImagePass
圌ã¯äŸåãšããŠç¬¬1ã®åäœãéžæããæœåºç©ããããinputImage
ïŒ
ããã£ã«ã¿ããå
¥åã§-å
¥åç»åinputImage
ãåºåã¯é¢æ°ã䜿çšããŠãã£ã«ã¿ãŒåŠçãããfilterImage (image:)
ç»åoutputImage
ã§ããããã¯éåžžã®åææäœãªã®ã§ãåå®çŸ©ããã ãã§æžã¿ãŸãmain()
ãããã£ã«ã¿ãŒãinputImage
ããããŒããæäœã®åºåã€ã¡ãŒãžãå
¥åã€ã¡ãŒãžãšããŠäœ¿çšããããã«ãããã2ã€ã®æäœã飿ºãããããšæããŸãããããè¡ãããã«ãæã
ã¯ããã£ã«ã¿ãªã³ã°ã®åäœãèšå®ãfilter
ãå€ã§nil
ïŒ
ã³ãŒããäžã«é
眮ãããŠããLoadAndFilter.playground
äžã®Githubãäžã®æäœã®ç Žå£ OperationQueue
ã³ãŒããäžã«é
眮ãããŠããCancellation.playground
äžã®Githubããã¥ãŒã®å¥ã®çŽ æŽãããOperationQueue
æ©äŒãèŠãŠã¿ãŸããã-ãªãã¬ãŒã·ã§ã³ãç Žå£ããèœåãæäœOperation
ããã¥ãŒã«é
眮ããåŸã¯ãæäœãOperationQueue
å®è¡ããããã®ç¬èªã®èšç»ããããæäœãå®å
šã«å¶åŸ¡ãããããæäœãå®è¡ããæ¹æ³ã¯ãããŸããããã ãOperation
ãã¡ãœããã䜿çšããŠç Žæ£ããããšãã§ããŸãcancel()
ã
ã¡ãœãããåŒã³åºãcancel()
ãšããã«æäœã忢ãããšæããããããŸããããããã§ã¯ãããŸããããã®ã¡ãœããcancel()
ã¯ãisCancelled
æäœããããã£ãã«èšå®ããã ãtrue
ã§ããæäœããŸã éå§ãããŠããªãå Žåãããã©ã«ãã®æ¹æ³start()
æäœã®å®è¡ãèš±å¯ãããããããã£isFinished
ãã«èšå®ããŸãtrue
ãããªãã¯ïŒãªãŒããŒã©ã€ãããå Žåoverride
ïŒã®æ¹æ³ãstart()
ãããªãã¯ããªãã®èœåä¿åããªããã°ãªããªãstart()
財ç£ã®ååŒãããã°ãæäœã®å®è¡ã鲿¢ããããisCancelled
ã«èšå®ãããŠãããtrue
ããããŠãæœè±¡ã¯ã©ã¹ãèŠããšãAsyncOperation
ãŸãã«ãããè¡ã£ãŠããããšãããããŸããããã«ãmain()
æäœã¡ãœããã§ãç¹ã«äœéãŸãã¯ãªãœãŒã¹éçŽçãªåŠçãå®è¡ããåã«isCancelled
ãæäœãæ¢ã«ç Žæ£ãããŠãããã©ãããããããã£ã§ãã¹ãããå¿
èŠããããŸããæäœãç Žæ£ãããtrue
ããããã£ã®å€ã衚瀺ãããå ŽåãæäœisCancelled
ã忢ããããã«å¿
èŠãªã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããããŸããæäœã®å ŽåOperation
ããšãã°ãç»å倿ãªã©ã®ããŒã«ã«ã§å®è¡ããå Žåãæäœã忢ã§ããŸãããµãŒããŒããç»åãããŠã³ããŒããããªã©ããããã¯ãŒã¯ãžã®ã¢ã¯ã»ã¹ã«é¢é£ããæäœã®å ŽåããµãŒããŒãçµæãè¿ããŸã§ãã®ãããªæäœã忢ããããšã¯ã§ããŸãããæäœã®ããŸããŸãªãã¹ããããã®éã«ãããžãã¯ãã远å ããŠããã®æäœãå®è¡ãç¶ãã䟡å€ããããã©ããããŸãã¯æäœãisFinished
çäŸ¡ç¶æ
ã«èšå®ãã䟡å€ããããã©ããã確èªããå¿
èŠãããtrue
ãŸããæäœãåé€ããããã«èšèšããAPI
ãã¯ã©ã¹Operation
ã¯éåžžã«åçŽã§ã2ã€ã®äœçœ®ã®ã¿ã§æ§æãããŸããã¡ãœãããåŒã³åºãcancel()
- isCancelled
æäœããããã£ãã«èšå®ãtrue
ãŸããã¡ãœãããåŒã³åºããããšãã«ããšã«æ³šæããããšãéèŠã§ããcancel()
ãããããã£isExecuting
ãšisFinished
ãã§å€åfalse
ããtrue
ãããããæäœãisCancelled = true
çµäºããã«ïŒïŒç Žå£ãããããšã¯å®å
šã«æ£åžžã§ãisFinished = true
ãããããã£isCancelled
ã¯ã忢ããå¿
èŠãããããšãæäœã«äŒããããããã£ã¯ãisFinished
æäœãæ¢ã«åæ¢ããŠããããšãã·ã¹ãã ã«äŒããŸããç§ãã¡ã®æœè±¡éåææäœã¯ãAsyncOperation
ã¡ãœããããªãŒããŒã©ã€ããcancel()
ãåäœç¶æ
ãèšå®ããæ¹æ³ã«state
ã.finished
ãŠããã®ãããªå€æŽã¯ã倿޿äœã®ããããã£ãèµ·ããisFinished
ãšisExecuting
ïŒãã¥ãŒOperationQueue
ã¯ãã¹ãŠã®æäœãç Žæ£ã§ããŸããäŸãšããŠããã€ãã®ã«ã¹ã¿ã æäœã䜿çšããŠãã¡ãœããåŒã³åºãã«æ£ããå¿çããæäœãååŸããæ¹æ³ãèŠãŠã¿ãŸãããcancel()
ãã³ãŒããäžã«é
眮ãããŠããCancellation.playground
äžã®Githubãæäœã«ArraySumOperation
ã¯ãinputArray
æŽæ°ã®ãã¢ã§æ§æãããã¿ãã«ã®å
¥åé
åãããoutputArray
ãåºåã§ãããã®åèšã®é
åã圢æããŸãã
æ°å€ã®åãã¢ã«å¯ŸããŠãCancellation.playgroundslowAdd
ã®ãã©ã«ããŒSource
ã«ãããé
ããå ç®é¢æ°ã䜿çšããåºåé
åã«è¿œå ããŸããæ°å€ã®å
¥åé
åãèšå®ããæäœã圢æããæäœãã¥ãŒã«è¿œå ããŸãoutputArray
sumOperation
queue
ã¿ã€ããŒãèµ·åãsumOperation
ãŸãcancel()
ãããã«ãããã¡ãœããåŒã³åºãã«å¯Ÿããæäœã®åå¿ã確èªã§ããæéãããã«èª¿æŽã§ããŸããããã«ãæäœã«ã¯completionBlock
ãã¿ã€ããŒã忢ãPlayground
outputArray
ãæäœããã€ã³ãããŠçµäºããŸãPlayground
ïŒ
ãã®ãããæäœãå®äºããã«ã¯sumOperation
5ç§ä»¥äžããããŸããä»åŒã³åºãããšã«ãã£ãŠéå§ããåŸã2ç§åŸã«ããã®æäœãç Žå£ãããcancel ()
ïŒ
ç§ãã¡ã¯ãäºæããªãçµæãåŸãŸãã-æäœãsumOperation
å®å
šã«ç¡ç Žå£æäœãçºçããŠããªããå®è£
ãããŠããŸããåé¡ã¯äœã§ããïŒ
ããããå®éã«ã¯ãã¡ãœããcancel ()
ã¯ããããã£isCancelled
ãtrue
ã«èšå®ããã ãã§ãããæäœã®åé€ã«å¿
èŠãªã¢ã¯ã·ã§ã³ã¯æäœã®éçºè
ã«å§ããããŸããããããã£ãã«isCancelled
èšå®ãããŠãããšããäºå®ã«å¯Ÿå¿ããå¿
èŠããããŸãtrue
ãåºåé
åã«åèšã远å ããåã«ãæäœãç Žæ£ããããã©ããã確èªããŸãããããŠããããç Žå£ãããå Žåããµã€ã¯ã«ãäžæããŸãïŒ
åéããŸãããPlayground
ïŒ
2ç§ããå°ãé
ããŠåæ¢ãã2ã€ã®éãååŸããŸãã.3çªç®ã®éãååŸããããšãããšãã«ãæäœã®ç Žå£ã«é¢ããã·ã°ãã«ãååŸããéã®ãããªãåä¿¡ã忢ããŸããããã®äŸã¯ãã³ãã³ãã«å¯ŸãããŠãŒã¶ãŒæäœã®å¿çãååŸããæ¹æ³ãæç¢ºã«ç€ºããŠããŸãcancel ()
ãã¿ãã«é
åãä»ããŠåºåé
åã«ãŒããååŸããããã«AnotherArraySumOperation
å¥ã®é¢æ°ã䜿çšãããç¹ã§ç°ãªãå¥ã®æäœãèŠãŠã¿ãŸãããslowAddArray
ïŒ
åã®ã±ãŒã¹ãšã®éãã¯ãã¿ãã«é
åã®èŠçŽ ãä»ããã«ãŒããmain()
æäœã¡ãœããã§ã¯ãªããå¥ã®é¢æ°ã§ãããç§ãã¡ã«ãšã£ãŠé£ããããšã§ãæäœãç Žæ£ãããå Žåããµã€ã¯ã«ãäžæããŸããããããéåžžã«æŽç·Žããããã®ã§ã¯ãããŸããããã®ãããªå¯èœæ§ããããŸãïŒ
颿°ã®å
¥åã«ã¯ãæŽæ°slowAddArray
ã®input
ãã¢ã®é
åã«å ããŠãåŒæ°ããããŸãprogress
ãããã¯Optional
ãé
åã®åŠçã®æ·±ããåŒæ°ãšããŠåããDouble(results.count) / Double(input.count
ãããè¿ã颿°ã§ãBool
ãããBool
ã«ãããã¢ã¬ã€ã®ç¶ç¶åŠçãæ±ºå®ãããŸããæ¹æ³ã§main()
æäœAnotherArraySumOperation
ïŒåã®å³ïŒã§ã¯ã颿°ã«slowAddArray
é
åãæž¡ããŸãããinputArray
åŒæ°ã¯progress
ããããŒã«ãã¯ããŒãžã£ãŒãšããŠèšèšãããŠãããprogress
å°å·ã«ããããã£ã䜿çšããŸãããããããã£progress
ã¯Double
ã§ãã®ã§ã100ãä¹ç®ããé
ååŠçã®å®äºçãšæäœã®å®äºçãååŸããŸãããæ¬¡ã«ãæäœã®ç Žæ£ã«å¯Ÿããå¿çãè¿ããŸããããã¯ãé
åã®åŠçãç¶è¡ãŸãã¯äžæããä¿¡å·ã§ããåå¿ã¯ããããã£ã®éã§ãisCancelled
ãçŽåã®æäœãå
ã«æ»ãSumOperation
ãæ°ããªæäœäžAnotherArraySumOperation
ïŒ
éç¶ç¶äºæ¥ãããåŸ2ç§ãæã
ã¯åãçµæãåŸã-æã
ã ãæ±ãããšãã§ãã2ã®é
åã«5- æäœãç Žæ£ãããåãã€ãŸã40ïŒ
ãæäœäžæé
å»¶ã4ç§ã«èšå®ããŸãã5ã®é
åã®4ã€ã®èŠçŽ ãã€ãŸã80ïŒ
ã¯ãæäœãç Žæ£ã
ããåã«åŠçãããŸãããåã
ã®æäœãããããã£ã«å¿çãããããç Žæ£ã§ããããšã確èªããããšãéåžžã«éèŠã§ãããããããã®æ¹æ³ã䜿çšããŠãåã
ã®ååŒã®ç Žå£ã«å ããŠãããªãã¯ãã¥ãŒæäœã«ãã¹ãŠéå§ã®æäœãåé€ããããšãã§ããŸãæ¹æ³ã䜿çšããŠisCancelled
cancel ()
OprationQueue
cancellAllOperations
ãããã¯ãåäžã®ç®çã§æ©èœããäžé£ã®æäœãããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãããã®ç®æšã¯ãè€æ°ã®ç¬ç«ããæäœã䞊è¡ããŠå®è¡ããããšããŸãã¯æ¬¡ã
ã«å®è¡ãããäŸåæäœã®ã°ã©ãã«ããããšã§ãããããã®äž¡æ¹ã®ã±ãŒã¹ãæ€èšããŸãããã¿ãŒã³1.ç¬ç«ããæäœã®ã°ã«ãŒããšé£æºãã
ã³ãŒããäžã«é
眮ãããŠããCancellationGroup.playground
äžã®Githubãåã®ã»ã¯ã·ã§ã³ã§ç€ºããæäœãšåãçµæãåŸãããããã«ã¿ã¹ã¯ãèšå®ArraySumOperation
ããŸããããã®æäœã¯ã¿ãã«ã®é
åãåãåãã(Int, Int)
ã¹ããŒå ç®é¢æ°ã䜿çšãslowAdd()
ãŠãã¿ãã«ãæ§æããæ°å€ã®åèšã®é
åãäœæããŸããå
¥åé
åã®ã³ã³ããŒãã³ãã®ãµã€ã¯ã«ã¯å
éšã«é ãããŠãArraySumOperation
ãŸããåå¥ã®éåžžã«åçŽãªåæäœã®ã°ã«ãŒããäœæããŸãããSumOperation
ãæäœã¯ãSumOperation
å
¥åãã¢ã®2ã€ã®æ°å€ã远å ãinputPair
ãäœéå ç®æ©èœãçµç±ããŠslowAdd()
ãçµæãè¿ããŸãoutput
ïŒ
æ®éã®ã¯ã©ã¹ãäœæGroupAdd
管çprivate
éå¶ã®ãã¥ãŒqueue
ãšäžé£ã®æäœãSumOperation
å
¥åé
åã®ãã¹ãŠã®ãã¢ã®åèšãèšç®ããåºåé
åã«outputArray
ã¿ãã«ãé
眮ããããã«ïŒInt, Int, Int )
ãœãŒã¹ããŒã¿ãšçµæã§æ§æãã
ãŸãïŒã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåæåãããšããæ°å€GroupAdd
ã®input
ãã¢ã®å
¥åé
åã圢æãããããããåã®æŒç®ã圢æããSumOperation
ãŸããcompletionBlock
åæŒç®ã§ãçµæãåºåã«è¿œå ãããŸãã¢ã¬ã€ã®outputArray
åäžäžã§å®è¡ãããprivate
ã·ãªã¢ã«ã©ã€ã³æäœappendOperation
ãé¿ããããã«ç«¶åç¶æ
ããã¯ã©ã¹ã¯ããã¹ãŠã®äžè¬çãªæäœãããOperation
ã¡ãœãããïŒstart()
ãcancel ()
ãwait ()
ããç§ãã¡ã¯ããè€éãªæäœããšããŠãããèããããšãã§ããããã«äœæããŸããEQ emplyarã¯ã©ã¹GroupAdd
æ°å€ã®ãã¢ã®é
åãå
¥åã«éããŸãïŒ
startãå®è¡ãgroupAdd
ã1ç§åŸ
æ©ããŠcancel ()
ãããã¡ãœããã䜿çšããŠãã¹ãŠã®å ç®æäœãæäœãã¥ãŒããåé€ããŸããçµæãšããŠããã¹ãŠã®åäœïŒäœ¿çšã®å®äºåŸwait()
ã«äœ¿çšããããšãã§ããªãmain queue
ããäžã«ããããšãã§ããPlayground
ïŒãæã
ã¯ãåºåé
åãççž®ïŒ
çµæã¯ãäžã§é²èЧããããšãå¯èœPlayground
CancelletionGroup.playground
ã§ã®Githubããã¿ãŒã³2.äŸåããæäœã®ã°ã«ãŒããšé£æºãã
ã³ãŒããäžã«é
眮ãããŠããCancellationFourImages.playground
äžã®GithubãäŸåããæäœã®ã°ã«ãŒããšããŠãæ¢ã«ããç¥ãããŠããçžäºæ¥ç¶ãããæäœã®ã°ã«ãŒããèããŠã¿ãŸãããUI
ããããã¯ãŒã¯ããã®ã€ã¡ãŒãžã®èªã¿èŸŒã¿ããã£ã«ã¿ãªã³ã°ã倿Žã§ããã¯ã©ã¹ã§ã·ãŒã±ã³ã¹ã䞊ã¹ãããã«ããŠãã ããImageProvider
ã«ãããã®æäœã管çããŸãOperationQueue
ã¡ãœããã䜿çšããŠstart ()
ãwait ()
ãšcancel ()
ã2ã€ã®æœè±¡æäœïŒã€ãŸããã¡ãœããå®è£
ãæããªãæäœmain()
ïŒããããŸãã 1ã€ã¯ãã§ã«æ
£ã芪ããã§ããASYNCHRONOUSæäœã§ããããã1ã€ã¯äŸåé¢ä¿ããå
¥åã€ã¡ãŒãžAsyncOperation
ãImageTakeOperation
æœåºããæäœã§ããã«åºã¥ããŠinputImage
dependecies
AsyncOperation
æå®ãããURLã®ããããã¯ãŒã¯ãããç»åãããŠã³ããŒãããæäœãäœæããŸãããã
ãã®æäœImagePass
ã¯ãåä¿¡ããç»åoutputImageãæäœã®ãã§ãŒã³ã«æ²¿ã£ãŠããã«éä¿¡ããããã®ãããã³ã«ã確èªããŸããæœè±¡æäœã¯ããã®æäœã®åæåäžã«æå®ãããŠããªãå ŽåãäŸåé¢ä¿ããImageTakeOperation
å
¥åã€ã¡ãŒãžinputImage
ãæœåºããã·ãŒã±ã³ã·ã£ã«æäœã®ãã§ãŒã³ã§ã€ã¡ãŒãžã転éããããã«äœ¿çšãããdependecies
æ¢ç¥ã®ãããã³ã«ã䜿çšããŠåºåã€ã¡ãŒãžããããã¯ã¢ãããã§ããŸãImagePass
ïŒ
æœè±¡ã¯ã©ã¹ImageTakeOperation
ãsuperclass
æäœãšããŠäœ¿çšãããšéåžžã«äŸ¿å©ã§ãäŸåæäœã®ãã§ãŒã³ã«é¢äžããŸããããšãã°ããã£ã«ã¿ãŒæäœã®å ŽåFilter
ïŒ
ãŸãã¯ãããããã¹ã¿ãŒãã¹ã¿ã€ã«ã§ç»åãããšãŒãžã³ã°ãããæäœã®å ŽåPostProcessImageOperation
ïŒ
ãŸãã¯ãã¯ããŒãžã£ãŒã䜿çšããŠç°å¢ã«å
¥åç»åããæšãŠããæäœã®å ŽåImageOutputOperation
ïŒ
ã¯ã©ã¹ãèŠãŠã¿ãŸãããImageProvider
ãéåžžã®ã¯ã©ã¹ãäœæããŠImageProvider
å¶åŸ¡ããããšãprivate
ãã¥ãŒæäœoperationQueue
ãããã³äžé£ã®æäœdataLoad
ãfilter
ããã³output
äžããããããç»åãããŒãããããã®URLããã£ã«ã¿ããããåè·¯ã«æž¡ãcompletion
ïŒ
ã¯ã©ã¹ã¯ImageProvider
ããã¹ãŠã®å
žåçãªåäœã®æã€Operation
ã¡ãœãããïŒstart()
ãcancel ()
ãwait ()
ãç§ãã¡ã¯ããè€éãªæäœãšããŠããããèæ
®ããããšãã§ããŸããã4ã€ã®ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãImageProvider
ã
ã€ã¡ãŒãžã®ããŒããéå§ããŸãïŒ
æäœã®å®äºãåŸ
æ©ããŠããã4ã€ã®ã€ã¡ãŒãžãååŸããŸãïŒ
ãã¹ãŠã®æäœã®ç¶ç¶æéã¯10ç§ããããã«è¶
ããŠããŸããã€ã¡ãŒãžã®ããŒããéå§ãã6ç§åŸ
ã£ãŠcancel ()
ãããã¡ãœããã䜿çšããŠãã¹ãŠã®æäœãåé€ããŸãããã®çµæã1çªç®ã3çªç®ã4çªç®ã®3ã€ã®ç»åã®ã¿ãããŠã³ããŒããããŸã
ãçµæã¯Githubã®ãã¬ã€ã°ã©ãŠã³ãCancelletionFourImages.playground
ã§è¡šç€ºã§ããŸãããã¿ãŒã³3. TableViewControllerãšCollectionViewControllerã®æäœ
ãããžã§ã¯ãã³ãŒãã¯Githubã®ãã©ã«ããŒOperationTableViewController
ã«ãããŸããå€ãã®å ŽåãiOSã¢ããªã±ãŒã·ã§ã³ã®ããŒãã«ã«ã¯ç»åãå«ãŸããŠããããã®ç»åãåä¿¡ããã«ã¯ãµãŒããŒãžã®ã¢ã¯ã»ã¹ãå¿
èŠã§ãããŸããåã®ã»ã¯ã·ã§ã³ã§èª¬æããããã£ã«ã¿ãªã³ã°ããªã©ã®åä¿¡ç»åã«å¯Ÿãã远å ã¢ã¯ã·ã§ã³ãå«ãŸããå ŽåããããŸããããã«ã¯ããªãã®æéãããããããŒãã«ãã¹ã ãŒãºã«ã¹ã¯ããŒã«ããã«ã¯ãç»åã䜿çšãããã¹ãŠã®æäœãå€éšã§éåæã«å®è¡ããå¿
èŠããããŸããåã®ã»ã¯ã·ã§ã³ã§ç€ºããã¯ã©ã¹ã®ã¢ããªã±ãŒã·ã§ã³ãèŠãŠã¿ãŸããããããã¯ããããã¯ãŒã¯ããã€ã¡ãŒãžãããŒãããããããã£ã«ã¿ãªã³ã°ããã³å€æŽããããã®çžäºæ¥ç¶ãããæäœã®ã°ã«ãŒãã«ãã§ã«éŠŽæã¿ã®ããããšãå®è¡ããŸããäŸãšããŠã1ã€ã ãã§æ§æãããéåžžã«åçŽãªã¢ããªã±ãŒã·ã§ã³ãèããŸãmain queue
ImageProvider
UI
Image Table View Controller
ãããŒãã«ã»ã«ã¯ãã€ã³ã¿ãŒãããããããŠã³ããŒããããã€ã¡ãŒãžãšããŒãããã»ã¹ãç€ºãæŽ»åã®ææšãå«ãŸããŠããã©ã®ïŒ
ãã¡ãã®ã¯ã©ã¹ã§ããImageTableViewController
ã¹ã¯ãªãŒã³ã®ãµãŒãã¹ãã©ã°ã¡ã³ãImage Table View Controller
ïŒ
ã¯ã©ã¹ã®ã¢ãã«ã¯ImageTableViewController
8ã€ã®é
åã§ãã®URLãïŒ- ãšããã§ã«å¡
- ãŽã§ããã£ã¢-ä»ã®ãã®ãããã¯ããã«é·ãããŒãããã³ãã£ã«ã¿ãªã³ã°
- ã¹ã³ããã©ã³ãã®å
- 忥µ-02
- ãšããã§ã«å¡
- 忥µå-16
- 忥µ-15
- 忥µ-12

ImageTableViewCell
ç»åãããŒããããããŒãã«ã®ã»ã«ã®ã¯ã©ã¹ã¯æ¬¡ã®ãšããã§ãã
Public API
ãã®ã¯ã©ã¹ã¯ãç»åã®URLã¢ãã¬ã¹ãimageURLString
å«ãæååã§ããããããçãããªãããã«èšå®ãããšãç»åã®ããŒãã¯è¡ãããããå転ãã€ãŒã«ãã®åœ¢ã®ã€ã³ãžã±ãŒã¿ã®ã¿ãæ©èœãå§ããŸãããã ããæ¢ã«äœããã®æ¹æ³ã§ããŒãããã³åŠçãããã€ã¡ãŒãžããããmethodãåŒã³åºããŠããå Žåãã©ã€ãã¢ãã¡ãŒã·ã§ã³ã䜿çšããŠç»é¢äžã®ãã®ã»ã«ã«è¡šç€ºããŸãããã®ã¯ã©ã¹ã«ã¯ãã¡ãœããã«å€ãå²ãåœãŠããšéå§ããã¢ã¯ãã£ããã£ã€ã³ãžã±ãŒã¿ããããŸããç»åã¯ãã»ã«ãšããŒãã«ã®çžäºäœçšãæ
åœããããªã²ãŒãã¡ãœããã«ããŒããããŸããimageURLString
nil
image
updateImageViewWithImage
spinner
imageURLString
tableView( _ : cellForRowAt:)
UITableViewDelegate
UITableViewCell
UITableView
ïŒ- â
tableView( _ : cellForRowAt:)
, - â
tableView( _ : willDisplay:forRowAt:)
, - â
tableView( _ : didEndDisplaying:forRowAt:)
,
ãã®ã¡ãœãããå¯èœãªéããä¿é²ãããããã«ãã¯ã©ã¹ImageProvider
ã䜿çšããéåæã€ã¡ãŒãžã®èªã¿èŸŒã¿ã®èŠæ±ã¯ã¡ãœããã®ç¯å²å€ã«ãªããŸãtableView( _ : cellForRowAt:)
ãtableView( _ : willDisplay:forRowAt:)
ããªã²ãŒãã¡ãœããã«é
眮ãããã»ã«ã衚瀺ãããããã«æºåããŸããå¥ã®tableView( _ : didEndDisplaying:forRowAt:)
ããªã²ãŒãã¡ãœããã¯ãã»ã«ãç»é¢ãé¢ãããŸã§ã«å®äºããªãã€ã¡ãŒãžã®ããŠã³ããŒãèŠæ±ãç Žæ£ããããã«äœ¿çšãããŸããããã¯ããªãäžè¬çãªã¢ãããŒãã§ãããåäœããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããŸãTableView
ãããã«ãããããŒãã«ã®ã¹ã¯ããŒã«ããã©ãŒãã³ã¹ãåäžããŸããããããæåã«ãImageProvider
ãã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããã¯ã©ã¹ã«æ»ããŸããImageProvider
åã®ã»ã¯ã·ã§ã³ã§äœ¿çšãããã¯ã©ã¹ããªã¢ã³ããšã¯å¯Ÿç
§çã«Playground
ãç°¡ç¥åããã圢åŒã䜿çšããŸããã€ãŸããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåæåãããšãImageProvider
ãisSuspended = true
æäœãã¥ãŒïŒïŒã忢ããŠããImageProvider
ãã¡ãœããã䜿çšããŠã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãå
·äœçã«éå§ããå¿
èŠã¯ãããŸãããstart()
åæåäžã«äŸåæäœã®ãã§ãŒã³ãããã«éå§ããwaitUntilFinished
çããèšå®ããŸããfalse
ããã¯Playground
ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãªããåæã¡ãœããã䜿çšããŸãwait()
ã
ãããã£ãŠãã¯ã©ã¹ImageProvider
ã«ã¯ã€ãã·ã£ã©ã€ã¶ãããããã®å
¥åã«ãç»åimageURLString
ã®URLãšã¯ã©ã¹ã®ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæãã人ã«åã®ç»åcompletion
ãgeneric
è¿ãClosure ãå«ãæååãæå®ããå¿
èŠããããŸãUIImage?
ImageProvider
ãèšç®ãããããããã£ã䜿çšãã代ããã«image
ãå
¥ååè·¯completion
ã«ã¯çœ²åããããŸã(UIImage?) -> ()
ãã€ãŸããç»åUIImage?
ãååŸããäœãè¿ããŸãããã«æ»ãããã«äœ¿çšã§ããŸãUITableViewController
ãããã«ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ç Žæ£ãèš±å¯ããå¿
èŠããããŸããããã«ãããImageProvider
ãã¹ãŠã®æäœãå®äºããåã«ããŒãã«ã»ã«ãç»é¢ãé¢ãããšãéå§ããããã¹ãŠã®æäœãç Žæ£ãããŸãããããã£ãŠãcancel()
ã¯ã©ã¹ã«ã¡ãœãããããImageProvider
ãŸãããã®ããããã®ã¯ã©ã¹ImageProvider
ã¯ããµãŒããŒããã®ã€ã¡ãŒãžã®ããŒãããã£ã«ã¿ãªã³ã°ãããã³ã¡ãœãããžã®é
ä¿¡ã«é¢ããäŸåæäœã®ã°ã«ãŒãã®éåæå®è¡ãæäŸããŸãUITableViewDelegate
ãå¿
èŠã«å¿ããŠããã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåé€ã§ããŸããã«æ»ãImageTableViewController
ãã¡ãœããtableView( _ tableView:, cellForRowAt indexPath:)
ã«ç»åãããŒããã代ããã«ãå¥ã®ããªã²ãŒãã¡ãœããtableView( _ tableView: , willDisplay cell:, forRowAt indexPath:)
ã§ãããè¡ããŸã- ãããŠãã¡ãœããã®ç»åãåé€ããŸãtableView( _ tableView: , didEndDisplaying cell:, forRowAt indexPath:)
ãããã2ã€ã®ã¡ãœããã®æ¡åŒµæ©èœextension
ãäœæããŸããããã¡ãœããããå§ããŸãããtableView( _ tableView: , willDisplay cell:, forRowAt indexPath:)
ã
ã¡ãœããã®tableView( _ tableView:, cellForRowAt indexPath:)
ããã«ãã»ã«cell
ãšindexPath
ããŸããæšæºã®æé ã«åŸã£ãŠãã»ã«ã®ã¿ã€ããã§ããããšã確èªãImageTableViewCell
ãŸããæ¬¡ã«ãç»åã®URLãšããŠã®imageProvider
æååimageURLs [ (indexPath as NSIndexPath).row ]
ãšããããŒã«ãã¯ããŒãžã£ãŒãšããŠèšèšãããã¯ããŒãžã£ãŒãäœæããŸããã¯ããŒãžã£ãŒã§ã¯ããã®ããŒãã«ã»ã«ã«è¡šç€ºããå¿
èŠãããç»åãååŸããŸããããã¯ãæŽæ°ã«äœ¿çšããå¿
èŠããããŸãimage
UI
main queue
ãªããªãUI
ãããã¯ã°ã©ãŠã³ããã¥ãŒïŒbackground queue
ïŒã§æŽæ°ãè¡ãããšãããšãããã¯æ©èœããããªããã®ç»åã衚瀺ãããªãã®ãäžæè°ã«æãããã§ããmain
ã¯ã©ã¹ããããã£ããããŸãOperationQueue
ãmain queue
ãå¿
èŠãªã»ã«ãæŽæ°ããã¡ãœããupdateImageViewWithImage( image )
ãåŒã³åºãmain queue
ã ãUITableViewCell
ã§ããããã§ãæäœã®åé€ã®å¯èœæ§ã«ã€ããŠèããå¿
èŠããããŸãããããè¡ãã«ã¯ãäœæããããã®ãžã®ãªã³ã¯ã倱ãå¿
èŠã¯ãããŸããimageProvider
ãããããªããšãåŸã§ãããèŠã€ããŠãããã«é¢é£ä»ããããŠããæäœãåé€ã§ããŸãããç§ãã¡ã¯ãã¯ã©ã¹ã®å
é ã«ç§»åImageTableViewController
ããCãšããååã®æ°ããããããã£ã远å imageProviders
ïŒ
ããããã£ã¯ãimageProviders
åã®ãªããžã§ã¯ãã®éåã§ããimageProvider
ãæåã¯ç©ºã§ããImageProvider.swiftãã¡ã€ã«ã®äžéšãèŠãŠã¿ãŸããããããªãã¯ãæ¢åã®æ¡åŒµãã§ã«ããã«ããã§ãããextension
ã¯ã©ã¹ImageProvider
ãããã³ã«ã確èªããHashable
ã»ããã«å¿
èŠãªã®Set
ïŒ
ç§ãã¡ã¯ãèšç®ããããã£ãååŸhashValue
ãšå¹³çã®ããã®æ¯èŒæŒç®åã==
ãããã§ããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãã€ã³ã¹ããŒã«ããŠæ¯èŒã§ããŸãImageProvider
ãã«æ»ãImageTableViewController
ãããã§ããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã远跡ImageProvider
ããimageProviders
çŸåšã¢ã¯ãã£ããªã»ããã«ãããã远å ã§ããŸãã
ãã®ã³ãŒããèŠãŠãäœãèµ·ãã£ãŠããããæ®µéçã«ç¢ºèªããŠã¿ãŸããããããã¯ããªã²ãŒãã¡ãœããã§ãtableView
ãã»ã«ãç»é¢ã«è¡šç€ºãããçŽåã«åŒã³åºãããŸãããã®æç¹ã§ãImageProvider
éåæçã«èªã¿èŸŒã¿ãç»åããã£ã«ã¿ãªã³ã°ããçµæã®ç»åimage
ãã«è¿ããã®ãäœæãcompletionHandler
ãŸããã®image
æŽæ°UIImageView
ã«äœ¿çšãmain queue
ãŸãããã®åŸãåŸã§ç Žå£ã§ããããImageProvider
ã«ã倿°ã§èšæ¶ãimageProviders
ãŸããããã¯ã次ã®ããªã²ãŒãã¡ãœããtableView
ã§tableView( _ tableView:, didEndDisplaying cell:, forRowAt indexPath:)
ãã»ã«ãç»é¢ãé¢ããçŽåŸã«åŒã³åºãããååã§è¡ããŸããããã¯ç§ãã¡ããã®ãã¹ãŠã®æäœãç Žå£ããå¿
èŠãããããšãããã«ããImageProvider
ïŒ
ãããè¡ãã«ã¯ãç§ãã¡ãèŠã€ãImageProvider
ã»ã«çšcell
åã³æ¹æ³ã䜿çšcancel ()
ããã«ImageProvider
ããã®ãããã€ããŒã®ãã¹ãŠã®æäœãåé€ããŠããããããã€ããŒèªäœãsetããåé€ããŸãimageProviders
ããã€ãã®ããã«ãæåã«æšæºæé ãå®è¡ããŠãã»ã«ã®ã¿ã€ããã§ããããšã確èªããŠããããã®ã»ã«ImageTableViewCell
ãšåãè¡ãæã€ãã¹ãŠã®ãããã€ããŒãèŠã€ããŸãImageURLString
ãããããã¹ãŠã®ãããã€ããŒã調ã¹ãŠåé€ããã»ããããåé€ããŸãimageProviders
ããããç§ãã¡ãããå¿
èŠããããã¹ãŠã§ããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãããã
ç»åã®èªã¿èŸŒã¿äžã«ã¢ã¯ãã£ããã£ã€ã³ãžã±ãŒã¿ãåäœããã¹ã¯ããŒã«ãé
å»¶ãªãéåžžã«é«éã«åäœããããã«ãªããŸãããç»åã¯ããŒãããããŸã§ç©ºã§ãã¢ãã¡ãŒã·ã§ã³åãããŸããçŽ æŽãããã
ãããžã§ã¯ãã³ãŒãã¯Githubã®ãã©ã«ããŒOperationTableViewController
ã«ãããŸããOperation
OperationQueue
GCD
GCD
ãããŠOperations
ã圌ããã©ã®ããã«ç°ãªãããã衚ã·ã§ãŒã§ã¯ã䌌ããããªæ©èœã®å€ããæã£ãŠããŸãã
DispatchGroup
ãããŠãOperationQueue
ãããã¯ãã¹ãŠã®ã¿ã¹ã¯ã®å®å
šãªå®äºã«é¢é£ããã€ãã³ããåŠçã§ããŸããwaitUntilAllOperationsAreFinished
ããã¥ãŒã®ã¡ãœãããéå§ãããšãã¯éåžžã«æ³šæããå¿
èŠãããOperationQueue
ãŸãmain queue
ãäŸåé¢ä¿ïŒdependecies
ïŒã«é¢ããŠGCD
ã¯ãã¿ã¹ã¯ã®ãã§ãŒã³ãprivate
é æ¬¡ïŒserial
ïŒã«å®è£
ããã ãDispatchQueue
ã§ããããããããã¯æã匷ãåŽé¢OperationQueue
ã§ããäŸåé¢ä¿ïŒdependecies
ïŒOperationQueue
ã¯åãªããã§ãŒã³ãããè€éã«ãªãå¯èœæ§ããããç°ãªããã¥ãŒã§æäœãå®è¡ã§ããŸãOperationQueue
ãã§ããªã¢ã䜿çšã§ããŸãGCD
ã·ãŒã±ã³ã·ã£ã«ïŒserial
ïŒãã¥ãŒãDispatchQueue
é©åã§ãªãå Žåã®ãã©ã€ã¿ãŒããšããªãŒããŒãã®åé¡ã解決ãããã䜿çšããŠãã®åé¡ã解決ããé©åãªæ¹æ³ã¯OperationQueue
éåžžã«çŽãããããflags
éåžžã«ç¹å¥ãªäŸåé¢ä¿ãå¿
èŠã§ããã§GCD
ã®ã¿åé€ã§ãDispatchWorkItems
ãŸããOperations
ç¬èªã®ã¡ãœããã䜿çšããŠæäœãåé€ããããšãcancel()
ããã¹ãŠã®æäœãããã«åé€ããããšãã§ããŸãOperationQueue
ãã§ç絡ãåé€ã§ãBlockOperation
ãŸãããšã®äž¡æ¹GCD
ã§Operations
ãSYNCHRONOUSæ©èœãéåæçã«å®è¡ã§ããŸããããããããšã§ããã®æäœOperation
ã¯ãå®è£
ãå«ãããã®åå©çšå¯èœãªæ©èœã®ãã¹ãŠã®ããŒã¿ãã«ãã»ã«åããããã®ãªããžã§ã¯ãæåã¢ãã«ãæäŸããŸãsubclasses
Operation
ãããããå€ãã®å Žåãè€éãªäŸåé¢ä¿ãæããªãåçŽãªã¿ã¹ã¯ã®å Žåã¯GCD
ãæäœãäœæãããããã軜ããã¡ãœããã䜿çšããæ¹ã䟿å©Operation
ã§ããããã«ãDispatch
ãããã¯ã®GCD
å®äºã«èŠããæéã¯ãããç§ããããªç§ãŸã§ã§ãOperation
éåžžã¯æ°ããªç§ããæ°åããããŸãããããã«
ãã®èšäºã§ã¯ãæäœã«é¢ãã以äžã®è³ªåãèæ
®ããOperation
ãã€ãã¥ãŒæäœOperationQueue
ïŒ
1.æäœãOperation
åé¡ãšãã©ã€ããµã€ã¯ã«ããšãã®ã¹ããŒã¿ã¹ã衚瀺ããããããã£ãæã€1ã€ã®ãªããžã§ã¯ãå
ã®ããŒã¿ãã«ãã»ã«åããããšãã§ããŸãã2. BlockOperation
ãªããžã§ã¯ãæåã®ãã©ãããŒãDispatchQueue.global()
ã§ããããã®ã°ã«ãŒãã®å¶åŸ¡ã倱ãã®ã§ã¯ãªããã¯ããŒãžã£ãŒã®ã°ã«ãŒãã®å®è¡ã远跡ã§ããŸãDispatchQueue.global()
ããã§ã«ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããŠããŠããããã«å¹²æžããããªãå Žåã¯BlockOperation
ã代æ¿ãšããŠåçŽãªæäœã«äœ¿çšãããšäŸ¿å©ã§ãã3.éçšãéå§ããããšããã®äž»ãªå¯èœæ§ãæããã«ãªããŸãGCD
Operations
DispatchQueue
Operation
OperationQueue
ãæäœãæºåãããOperation
ããããOperationQueue
ã«æž¡ããŸããããã¯ããã¹ãŠã®æäœã®å®è¡é åºãå¶åŸ¡ããŸããããã¯ãæ¬è³ªçã«éåžžã«åçŽãªã¢ãã«ã§ããããã«ãã¹ã¬ããããã°ã©ãã³ã°ã®è€éããé ããŸããOperationQueue
ã«äŒŒãŠDispatchGroup
ãããç°ãªãã¬ãã«ã®æäœãçµã¿åãããŠqualityOfService
ããã¹ãŠã®æäœãå®äºãããŸã§åŸ
ã€ããšãã§ããŸãããã ãããã®sync
ã¡ãœãããåŒã³åºããšãã¯éåžžã«æ³šæããå¿
èŠããããŸãã4.æäœã«ASYNCHRON颿°ãå«ããã«ã¯Operation
ããã®å®äºãæ£ç¢ºã«èšé²ããããã«ç¹å¥ãªããšãããå¿
èŠããããŸããKVOAsyncOperation
ã䜿çšããŠASYNCHRONæäœãæåã§ç®¡çããå¿
èŠããããŸãã5.æ¯é¡ã®ãªãæäœOperation
ããããäžé£ã®æäœã«çµã¿åãããŠãè€éãªäŸåé¢ä¿ã°ã©ãïŒdependencies
ïŒãäœæã§ãããšããããšã§ããããã¯ãOperation
1ã€ä»¥äžã®ä»ã®æäœOperation
ãå®äºãããŸã§éå§ã§ããªãæäœãéåžžã«ç°¡åã«èå¥ã§ããããšãæå³ããŸãããã®èšäºã§ã¯ããããã³ã«protocol
ã䜿çšãOperation
ãŠãäŸåé¢ä¿ã°ã©ãïŒdependencies
ïŒã®æäœéã§ããŒã¿ã転éããæ¹æ³ã瀺ããŸãããã ãdeadLock
ãç¹ã«ç°ãªãæäœã®æäœéã«äŸåé¢ä¿ãããå Žåã¯ã解決ã§ããªããããããã¯ãåŒãèµ·ããå¯èœæ§ã®ãããµã€ã¯ã«ãåé¿ããããã«ãäŸåé¢ä¿ã°ã©ãã調æ»ããå¿
èŠããããŸãOperationQueue
ã6.æäœOperation
ãæäœãã¥ãŒã«è»¢éãããOperationQueue
ãã¿ãŒã³OperationQueue
èªäœãå®è¡ã®ããã®æäœãéå§ããããã®ã¹ã±ãžã¥ãŒã«ãäœæãããã®å®è¡ãå¶åŸ¡ããããããã®æäœã®å¶åŸ¡ã倱ããŸãããã ããã¡ãœããcancel ()
ã䜿çšããŠãæäœãéå§ãããªãããã«ããããšãã§ããŸãããã®èšäºã§ã¯isCancelled
ãæäœã®æ§ç¯æã«ããããã£ãèæ
®ããOperation
æ¹æ³ãšãæäœãã¥ãŒã®ãã¹ãŠã®æäœãå®å
šã«åé€ããæ¹æ³ã瀺ããŸãOperationQueue
ã7.çµè«ã¯ãã€ã³ã¿ãŒãããããååŸããç»åã§ããŒãã«ãã¹ã¯ããŒã«ããå¿
èŠããããããã£ã«ã¿ãªã³ã°ããããšãŒãžã³ã°ããªã©ã®è¿œå ã¢ã¯ã·ã§ã³ãå¿
èŠãªå Žåã®å®éã®ã·ããªãªãåæ ããã¢ããªã±ãŒã·ã§ã³ã®éçºã瀺ããŠããŸããããã«ã¯ããªãã®æéãããããããŒãã«ãã¹ã ãŒãºã«ã¹ã¯ããŒã«ããã«ã¯ãç»åã䜿çšãããã¹ãŠã®æäœãå€éšã§éåæã«å®è¡ããå¿
èŠããããŸãmain queue
ããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãæäœOperation
ãç¹ã«éåææäœAsyncOperation
ãšãã®äŸåé¢ä¿ïŒdependencies
ïŒãæäœããããã®å¹
åºãæè¡ã䜿çšããŸãããããã«ããã倧å¹
ãªæ¹åãéæããããšãã§ããŸããUI
ãäžç·ã«ãã®èšäºã§ã以åã®ã®ãããªãã®äžã«ãã«ãã¹ã¬ããåŠçã®å
šäœåSwift 3
ãš4
ä»ååšããŠããiOSã®äžããå®å®æ§ïŒïŒã«å ããŠããã«ãã¹ã¬ãããSwift
ããŒãžã§ã³ã®Swift 5
åªå
é äœABI
ãšããŠå®£èšãããŠããå ŽåãçŸåšæ·èšãããŠãããã«ãã¹ã¬ããåŠçã®å°æ¥ã®å¯èœæ§ã®è°è«ã«å
šé¢çã«åå ã§ããŸãconcurrency
ãããŒãžã§ã³Swift 5
å®å
šã«æ°ãããã«ãã¹ã¬ããã¢ãã«ã®äœæ¥ã®éå§ã®ã¿ãå«ãŸãããã®å®è£
ã¯å°æ¥ã®ããŒãžã§ã³ã§ãç¶ç¶ãããŸããSwift 5ã«ã¯ãå°æ¥ã®ãã«ãã¹ã¬ããã¢ãã«ã®ææ¡ãæ¢ã«ãããŸããã ãããã¢ãŒã¿ãŒãã€ããïŒããããŠè¡ã£ãŠãã ãããSwiftã®é²åã¯ããã§èŠãããšãã§ããŸããåç
§è³æ
â WWDC2015ãé«åºŠãªNSOperationsïŒã»ãã·ã§ã³226ïŒãâ iOSã®NSOperationsããæ¥œãã¿ãã ããâ Swiftã®NSOperationãšNSOperationQueueã®ãã¥ãŒããªã¢ã«â GCDãšOperationsã®iOSåæå®è¡æ§â IOSã® äžŠè¡æ§â Swiftã®åæå®è¡æ§ïŒ1ã€ã®å¯èœãªã¢ãããŒã