ÕâÆªÎÄÕ²»ÊÇÕë¶Ôµ±Ç°°æ±¾
Swift 3 µÄ£¬¶øÊǶÔÔ¤¼ÆÓÚ 2018 Äê·¢²¼µÄ Swift 5 µÄÒ»Ð©ÌØÐԵIJÂÏë¡£Èç¹ûÁ½ÄêºóÎÒ»¹¼ÇµÃÕâÆªÎÄÕ£¬¿ÉÄÜ»á»ØÀ´¸üÐÂÒ»²¨¡£ÔÚ´Ë֮ǰ£¬Çëµ±×÷һƪ¶ÔÏÖ´úÓïÑÔ²¢Ðбà³ÌÌØÐԵIJ»Ì«ÑϽ÷¿ÆÆÕÎÄÀ´¿´´ý¡£

CPU ËÙ¶ÈÒѾºÜ¶àÄêûÓдóµÄÍ»ÆÆÁË£¬Ó²¼þÐÐÒµ¸ü¶àµØ½«Öصã·ÅÔÚ¶àºËÐļ¼ÊõÉÏ£¬¶øÓëÖ®¶ÔÓ¦£¬Èí¼þÖв¢Ðбà³ÌµÄ¸ÅÄîÒ²Ô½À´Ô½ÖØÒª¡£ÈçºÎÀûÓöàºËÐÄ
CPU£¬ÒÔ¼°ÓµÓÐÃܼ¯¼ÆËãµ¥ÔªµÄ GPU£¬À´½øÐпìËٵĴ¦ÀíºÍ¼ÆË㣬ÊǺܶ࿪·¢ÕßÊ®·Ö¸ÐÐËȤµÄÊÂÇé¡£ÔÚ½ñÄêÄê³õ
Swift 4 µÄÕ¹ÍûÖУ¬Swift ÏîÄ¿µÄ¸ºÔðÈË Chris Lattern ±íʾ¿ÉÄܲ¢²»»áÕâô¿ìÌṩÓïÑԲ㼶µÄ²¢Ðбà³ÌÖ§³Ö£¬²»¹ý×î½ü
Chris ÓÖÔÚ IBM µÄÒ»´Î¹ØÓÚ±àÒëÆ÷µÄ·ÖÏíÖÐÃ÷È·Ìáµ½£¬Óкܴó¿ÉÄÜ»áÔÚ Swift 5 ÖÐÌí¼ÓÓïÑÔ¼¶±ðµÄ²¢ÐÐÌØÐÔ¡£
Õâ¶Ô Swift Éú̬ÊÇÒ»¸öºÃÏûÏ¢£¬Ò²ÊÇÒ»¸ö´óÏûÏ¢¡£²»¹ýÕâÆäʵ²¢²»ÊÇʲôÐÂÏʵÄÊÂÇ飬ÉõÖÁ¿ÉÒÔ˵ÊÇÒ»ÃÅÏÖ´úÓïÑÔ·¢Õ¹µÄ±Ø¾Â·¾¶ºÍ±Ø±¸ÌØÐÔ¡£ÒòΪ
Objective-C/Swift ÏÖÔÚȱ·¦Õâ·½ÃæµÄÄÚÈÝ£¬ËùÒԺܶàרעÓÚ iOS µÄ¿ª·¢Õß¶Ô²¢Ðбà³Ì»áºÜİÉú¡£ÎÒÔÚÕâÆªÎÄÕÂÀï½áºÏ
Swift ÏÖ×´¼òµ¥½éÉÜÁËһЩÕâÃÅÓïÑÔÀï²¢Ðбà³Ì¿ÉÄܵÄʹÓ÷½Ê½£¬Ï£ÍûÄܰïÖú´ó¼Ò³õ¿úÞ¶¡£(ËäÈ»ÎÒ×Ô¼ºÒ²»¹Ãþ²»µ½Ãž¶Ôںη½...)
Swift ÏÖÓеIJ¢ÐÐÄ£ÐÍ
Swift ÏÖÔÚûÓÐÓïÑÔ²ãÃæµÄ²¢ÐлúÖÆ£¬²»¹ýÎÒÃÇȷʵÓÐһЩ»ùÓÚ¿âµÄÏ̵߳÷¶ÈµÄ·½°¸£¬À´½øÐв¢ÐвÙ×÷¡£
»ùÓÚ±Õ°üµÄÏ̵߳÷¶È
ËäÈ»»ÐÈç¸ôÊÀ£¬²»¹ý GCD (Grand Central Dispatch) ȷʵÊÇ´Ó iOS 4 ²Å¿ªÊ¼×ß½øÎÒÃǵÄÊÓÒ°µÄ¡£ÔÚ
GCD ºÍ block ±»¼ÓÈë֮ǰ£¬ÎÒÃÇÏëҪпªÒ»¸öÏß³ÌÐèÒªÓõ½ NSThread »òÕß NSOperation£¬È»ºóʹÓÃ
delegate µÄ·½Ê½À´½ÓÊջص÷¡£ÕâÖÖÊéд·½Ê½Ì«¹ý¹ÅÀÏ£¬Ò²Ï൱Âé·³£¬ÈÝÒ׳ö´í¡£GCD ΪÎÒÃÇ´øÀ´ÁËÒ»Ì׺ܼòµ¥µÄ
API£¬¿ÉÒÔÈÃÎÒÃÇÔÚÏß³ÌÖнøÐе÷¶È¡£Ôںܳ£Ò»¶Îʱ¼äÀÕâÌ× API ³ÉΪÁË iOS ÖжàÏ̱߳à³ÌµÄÖ÷Á÷·½Ê½¡£Swift
¼Ì³ÐÁËÕâÌ× API£¬²¢ÇÒÔÚ Swift 3 Öн«ËüÃÇÖØÐµ¼ÈëΪÁ˸ü·ûºÏ Swift Ó﷨ϰ¹ßµÄÐÎʽ¡£ÏÖÔÚÎÒÃÇ¿ÉÒÔ½«Ò»¸ö²Ù×÷ºÜÈÝÒ×µØÅÉ·¢µ½ºǫ́½øÐУ¬Ê×ÏÈ´´½¨Ò»¸öºǫ́¶ÓÁУ¬È»ºóµ÷ÓÃ
async ²¢´«ÈëÐèÒªÖ´Ðеıհü¼´¿É£º

ÔÚ async µÄ±Õ°üÖУ¬ÎÒÃÇ»¹¿ÉÒÔ¼ÌÐø½øÐÐÅÉ·¢£¬×î³£¼ûµÄÓ÷¨¾ÍÊÇ¿ªÒ»¸öºǫ́Ï߳̽øÐкÄʱ²Ù×÷ (´ÓÍøÂç»ñÈ¡Êý¾Ý£¬»òÕß
I/O µÈ)£¬È»ºóÔÚÊý¾Ý×¼±¸Íê³Éºó£¬»Øµ½Ö÷Ï̸߳üРUI£º

µ±È»£¬ÏÖÔÚ¹À¼ÆÒѾ²»»áÓÐÈËÔÙÕâô×öÍøÂçÇëÇóÁË¡£ÎÒÃÇ¿ÉÒÔʹÓÃרÃÅµÄ URLSession À´½øÐзÃÎÊ¡£URLSession
ºÍ¶ÔÓ¦µÄ dataTask »á½«ÍøÂçÇëÇóÅÉ·¢µ½ºǫ́Ị̈߳¬ÎÒÃDz»ÔÙÐèÒªÏÔʽ¶ÔÆäÖ¸¶¨¡£²»¹ý¸üРUI µÄ¹¤×÷»¹ÊÇÐèÒª»Øµ½Ö÷Ị̈߳º

»Øµ÷µØÓü
»ùÓÚ±Õ°üÄ£Ð͵ķ½Ê½£¬²»ÂÛÊÇÖ±½ÓÅÉ·¢»¹ÊÇͨ¹ý URLSession µÄ·â×°½øÐвÙ×÷£¬¶¼ÃæÁÙÒ»¸öÑÏÖØµÄÎÊÌâ¡£Õâ¸öÎÊÌâ×îÔçÔÚ
JavaScript ÖгôÃûÕÑÖø£¬ÄǾÍÊǻص÷µØÓü (callback hell)¡£
ÊÔÏëÒ»ÏÂÎÒÃÇÈç¹ûÓÐһϵÁÐÐèÒªÒÀ´Î½øÐеÄÍøÂç²Ù×÷£ºÏȽøÐеǼ£¬È»ºóʹÓ÷µ»ØµÄ token »ñÈ¡Óû§ÐÅÏ¢£¬½ÓÏÂÀ´Í¨¹ýÓû§
ID »ñÈ¡ºÃÓÑÁÐ±í£¬×îºó¶Ôij¸öºÃÓѵãÔÞ¡£Ê¹Óô«Í³µÄ±Õ°ü·½Ê½£¬Õâ¶Î´úÂë»áÊÇÕâÑù£º

ÕâÒѾÊÇʹÓÃÁËÎ²Ëæ±Õ°üÌØÐÔ¼ò»¯ºóµÄ´úÂëÁË£¬Èç¹ûʹÓÃÍêÕûµÄ±Õ°üÐÎʽµÄ»°£¬Äã»á¿´µ½Ò»´ó¶Ñ
}) ¶ÑµþÆðÀ´¡£else ·¾¶Éϼ¸ºõ²»¿ÉÄÜÈ·¶¨¶ÔÓ¦¹ØÏµ£¬¶ø¶ÔÓڳɹ¦µÄ´úÂë·¾¶À´Ëµ£¬ÄãÒ²ÐèÒªºÜ¶à¶îÍâµÄ¾«Á¦À´Àí½âÕâЩ´úÂë¡£Ò»µ©ÕâÖÖ»ùÓÚ±Õ°üµÄ»Øµ÷Ì«¶à£¬²¢Ç¶ÌׯðÀ´£¬ÔĶÁËüÃǵÄʱºò¾ÍºÃËÆÉíÏݵØÓü¡£

²»ÐÒµÄÊÇ£¬ÔÚ Cocoa ¿ò¼ÜÖÐÎÒÃÇËÆºõ¶Ô´Ëû̫¶àºÃ°ì·¨¡£²»¹ýÎÒÃÇȷʵÓкܶ෽·¨À´½â¾ö»Øµ÷µØÓüµÄÎÊÌ⣬ÆäÖÐ×î³É¹¦µÄÓ¦¸ÃÊÇ
Promise »òÕß Future µÄ·½°¸¡£
Promise/Future
ÔÚÉîÈë Promise »ò Future ֮ǰ£¬ÎÒÃÇÏÈÀ´½«ÉÏÃæµÄ»Øµ÷×öһЩÕûÀí¡£¿ÉÒÔ¿´µ½£¬ËùÓеÄÇëÇóÔڻص÷ʱ¶¼°üº¬ÁËÁ½¸öÊäÈëÖµ£¬Ò»¸öÊÇÏñtoken£¬user
ÕâÑùÎÒÃǽÓÏÂÀ´»áʹÓõ½µÄ½á¹û£¬ÁíÒ»¸öÊÇ´ú±í´íÎóµÄ err¡£ÎÒÃÇ¿ÉÒÔ´´½¨Ò»¸ö·ºÐÍÀàÐÍÀ´´ú±íËüÃÇ£º

ÖØ¹¹ send ·½·¨½ÓÊյĻص÷ÀàÐͺó£¬ÉÏÃæµÄ API µ÷ÓþͿÉÒÔ±äΪ£º

¿´ÆðÀ´²¢Ã»ÓÐʲô¸ÄÉÆ£¬¶Ôô£¿ÎÒÃÇÖ»²»¹ýʹÓÃÒ»¶Ñ ({}) µÄµØÓü»»³ÉÁË switch...case µÄµØÓü¡£µ«ÊÇ£¬ÎÒÃÇÈç¹û½«
request °üװһϣ¬Çé¿ö¾Í»áÍêÈ«²»Í¬¡£

ÎÒÃÇÕâÀïûÓиø³ö Promise µÄ¾ßÌåʵÏÖ£¬¶øÖ»ÊǸø³öÁ˸ÅÄîÐÔµÄ˵Ã÷¡£Promise ÊÇÒ»¸ö·ºÐÍÀàÐÍ£¬ËüµÄ³õʼ»¯·½·¨½ÓÊÜÒ»¸öÒÔ
fulfill ºÍreject ×÷Ϊ²ÎÊýµÄº¯Êý×÷Ϊ²ÎÊý (Ò»¿ªÊ¼Õâ¿ÉÄÜÓеãÞÖ¿Ú£¬Äã¿ÉÒÔ½áºÏ´úÂëÔÙ¶ÁÒ»´Î)¡£Õâ¸öÀàÐÍÀﻹÌṩÁË
then ºÍ catch ·½·¨£¬then ·½·¨µÄ²ÎÊýÊÇÁíÒ»¸ö±Õ°ü£¬ÔÚ fulfill ±»µ÷ÓÃʱ£¬ÎÒÃÇ¿ÉÒÔÖ´ÐÐÕâ¸ö±Õ°ü£¬²¢·µ»ØÐµÄ
Promise (Ö®ºó»á¿´µ½¾ßÌåµÄʹÓÃÀý×Ó)£º¶øÔÚ reject ±»µ÷ÓÃʱ£¬Í¨¹ý catch ·½·¨ÖжÏÕâ¸ö¹ý³Ì¡£
ÔÚ½ÓÏÂÀ´µÄ Request µÄÀ©Õ¹ÖУ¬ÎÒÃǶ¨ÒåÁËÒ»¸ö·µ»Ø Promise µÄ¼ÆËãÊôÐÔ£¬Ëü½«³õʼ»¯Ò»¸öÄÚÈÝÀàÐÍΪ
Response µÄ Promise (ÕâÀïµÄResponse ÊǶ¨ÒåÔÚ Request ÐÒéÖеĴú±í¸ÃÇëÇó¶ÔÓ¦µÄÏìÓ¦µÄÀàÐÍ£¬ÏëÁ˽â¸ü¶àÏà¹ØµÄÄÚÈÝ£¬¿ÉÒÔ¿´¿´ÎÒ֮ǰµÄһƪʹÓÃÃæÏòÐÒé±à³ÌµÄÎÄÕÂ)¡£ÎÒÃÇÔÚ
.success ʱµ÷Óà fulfill£¬ÔÚ .failure ʱµ÷Óà reject¡£
ÏÖÔÚ£¬ÉÏÃæµÄ»Øµ÷µØÓü¿ÉÒÔÓà then ºÍ catch µÄÐÎʽ½øÐÐչƽÁË£º

Promise ±¾ÖÊÉϾÍÊÇÒ»¸ö¶Ô±Õ°ü»òÕß˵ Result ÀàÐ͵ķâ×°£¬Ëü½«Î´À´¿ÉÄܵĽá¹ûËù¶ÔÓ¦µÄ±Õ°üÏÈ´æ´¢ÆðÀ´£¬È»ºóµ±È·ÊµµÃµ½½á¹û
(±ÈÈçÍøÂçÇëÇó·µ»Ø) µÄʱºò£¬ÔÙÖ´ÐжÔÓ¦µÄ±Õ°ü¡£Í¨¹ýʹÓà then£¬ÎÒÃÇ¿ÉÒÔ±ÜÃâ±Õ°üµÄÖØµþǶÌ×£¬¶øÊÇʹÓõ÷ÓÃÁ´µÄ·½Ê½½«Òì²½²Ù×÷´®½ÓÆðÀ´¡£Future
ºÍPromise ÆäʵÊÇͬÑù˼ÏëµÄ²»Í¬ÃüÃû£¬Á½Õß»ù±¾Ö¸´úµÄÊÇÒ»¼þʶù¡£ÔÚ Swift ÖУ¬ÓÐһЩ·â×°µÃºÜºÃµÄµÚÈý·½¿â£¬¿ÉÒÔÈÃÎÒÃÇÒÔÕâÑùµÄ·½Ê½À´Êéд´úÂ룬PromiseKit
ºÍ BrightFutures ¾ÍÊÇÆäÖеÄٮٮÕߣ¬ËüÃÇȷʵÄܰïÖú±ÜÃâ»Øµ÷µØÓüµÄÎÊÌ⣬ÈÃǶÌ×µÄÒì²½´úÂë±äµÃÕû½à¡£

async/await£¬¡°´®ÐС±Ä£Ê½µÄÒì²½±à³Ì
ËäÈ» Promise/Future µÄ·½Ê½Äܽâ¾öÒ»²¿·ÖÎÊÌ⣬µ«ÊÇÎÒÃÇ¿´¿´ÉÏÃæµÄ´úÂ룬ÒÀÈ»Óв»ÉÙÎÊÌâ¡£
1.ÎÒÃÇÓÃÁ˺ܶಢ²»Ö±¹ÛµÄ²Ù×÷£¬¶ÔÓÚÿ¸ö request£¬ÎÒÃǶ¼Éú³ÉÁ˶îÍâµÄ Promise£¬²¢Óà then
´®Áª¡£ÕâЩÆäʵ¶¼ÊÇÄ£°å´úÂ룬Ӧ¸Ã¿ÉÒÔ±»¸üºÃµØ½â¾ö¡£
2.¸÷¸ö then ±Õ°üÖеÄÖµÖ»ÔÚ×Ô¼º¹Ì¶¨µÄ×÷ÓÃÓòÖÐÓÐЧ£¬ÕâÓÐʱºòºÜ²»·½±ã¡£±ÈÈçÈç¹ûÎÒÃǵÄ
LikeFriend ÇëÇóÐèҪͬʱ·¢Ë͵±Ç°Óû§µÄ token µÄ»°£¬ÎÒÃÇÖ»ÄÜÔÚ×îÍâ²ãÌí¼ÓÁÙʱ±äÁ¿À´³ÖÓÐÕâЩ½á¹û£º

3.Swift ÄÚ½¨µÄ throw µÄ´íÎó´¦Àí·½Ê½²¢²»ÄܺܺõغÍÕâÀïµÄ Result ºÍ catch
{ error in ... } µÄ·½Ê½ºÏ×÷¡£Swift throw ÊÇÒ»ÖÖͬ²½µÄ´íÎó´¦Àí·½Ê½£¬Èç¹ûÏëÒªÔÚÒì²½ÊÀ½çÖÐʹÓÃÕâÖֵϰ£¬»áÏԵøñ¸ñ²»Èë¡£Óï·¨ÉÏÓв»ÉÙÀí½âµÄÀ§ÄÑ£¬´úÂëÒ²»áѸËÙ±äµÃÊ®·Ö³óª¡£
Èç¹û´ÓÓïÑÔ²ãÃæ×ÅÊֵϰ£¬ÕâЩÎÊÌâ¶¼ÊÇ¿ÉÒÔ±»½â¾öµÄ¡£Èç¹û¶Ô΢Èí¼¼ÊõÕ»ÓÐËù¹ØÐĵÄͬѧӦ¸ÃÖªµÀ£¬ÔçÔÚ
2012 Äê C# 5.0 ·¢²¼Ê±£¬¾Í°üº¬ÁËÒ»¸öÈÃÒµ½ç¾ªÎªÌìÈ˵ÄÌØÐÔ£¬ÄǾÍÊÇ async ºÍ await
¹Ø¼ü×Ö¡£ÕâÁ½¸ö¹Ø¼ü×Ö¿ÉÒÔÈÃÎÒÃÇÓÃÀàËÆÍ¬²½µÄÊéд·½Ê½À´Ð´Òì²½´úÂ룬ÕâÈÃ˼άģÐͱäµÃÊ®·Ö¼òµ¥¡£Swift 5
ÖÐÓÐÍûÒýÈëÀàËÆµÄÓï·¨½á¹¹£¬Èç¹ûÎÒÃÇÓÐ async/await£¬ÎÒÃÇÉÏÃæµÄÀý×Ó½«»á±ä³ÉÕâÑùµÄÐÎʽ£º

×¢Ò⣬ÒÔÉÏ´úÂëÊǸù¾ÝÏÖÔÚ Swift Óï·¨£¬¶ÔÈç¹û´æÔÚ async ºÍ await ʱÓïÑÔµÄÐÎʽµÄÍÆ²â¡£ËäÈ»Õâ²»´ú±í½ñºó
Swift ÖÐÒì²½±à³ÌÄ£Ð;ÍÊÇÕâÑù£¬»òÕß˵ async ºÍ await ¾ÍÊÇÕâÑùʹÓ㬵«ÊÇÓ¦¸Ã´ú±íÁËÒ»¸ö±»ÆäËûÓïÑÔÑéÖ¤¹ýµÄ¿ÉÐз½Ïò¡£
°´ÕÕ×¢Ê͵ıàºÅ£¬½øÐÐһЩ¼òµ¥µÄ˵Ã÷£º
Õâ¾ÍÊÇÎÒÃÇͨ³£µÄ @IBAction£¬µã»÷ºóÖ´ÐÐ doSomething¡£
doSomething ±» async ¹Ø¼ü×ÖÐÞÊΣ¬±íʾÕâÊÇÒ»¸öÒì²½·½·¨¡£async ¹Ø¼ü×ÖËù×öµÄÊÂÇéÖ»ÓÐÒ»¼þ£¬ÄǾÍÊÇÔÊÐíÔÚÕâ¸ö·½·¨ÄÚʹÓÃ
await ¹Ø¼ü×ÖÀ´µÈ´ýÒ»¸ö³¤Ê±¼ä²Ù×÷Íê³É¡£ÔÚÕâ¸ö·½·¨ÀïµÄÓï¾ä½«±»ÒÔͬ²½·½Ê½Ö´ÐУ¬Ö±µ½Óöµ½µÚÒ»¸ö await¡£¿ØÖÆÌ¨½«»á´òÓ¡
"Doing something..."¡£
Óöµ½µÄµÚÒ»¸ö await¡£´ËʱÕâ¸ö doSomething ·½·¨½«½øÈëµÈ´ý״̬£¬¸Ã·½·¨½«»á¡°·µ»Ø¡±£¬Ò²¼´À뿪ջÓò¡£½ÓÏÂÀ´
bunttonPressed ÖÐdoSomething µ÷ÓÃÖ®ºóµÄÓï¾ä½«±»Ö´ÐУ¬¿ØÖÆÌ¨´òÓ¡ "Button
Pressed"¡£
token£¬user£¬friends ºÍ result ½«±»ÒÀ´Î await Ö´ÐУ¬Ö±µ½»ñµÃ×îÖÕ½á¹û£¬²¢½øÐÐ
updateUI¡£
ÀíÂÛÉÏ await ¹Ø¼ü×ÖÔÚÓïÒåÉÏÓ¦¸Ã°üº¬ throws£¬ËùÒÔÎÒÃÇÐèÒª½«ËüÃǰü¹üÔÚ do...catch
ÖУ¬¶øÇÒ¿ÉÒÔʹÓà Swift ÄÚ½¨µÄÒì³£´¦Àí»úÖÆÀ´¶ÔÇëÇó²Ù×÷Öз¢ÉúµÄ´íÎó½øÐв¶»ñºÍ´¦Àí¡£»»¾ä»°Ëµ£¬ÎÒÃÇÈç¹û¶Ô´íÎ󲻸ÐÐËȤ£¬Ò²¿ÉÒÔʹÓÃÀàËÆ
try? ºÍ try! µÄ
¶ÔÓÚ Request£¬ÎÒÃÇÐèÒªÌí¼Ó async °æ±¾µÄ·¢ËÍÇëÇóµÄ·½·¨¡£dataTask µÄ resumeAsync
·½·¨ÊÇÔÚ Foundation ÖÐÕë¶ÔÄÚ½¨Òì²½±à³ÌËùÖØÐ´µÄ°æ±¾¡£ÎÒÃÇÔڴ˵ȴýËüµÄ½á¹û£¬È»ºó½«½á¹û½âÎöΪ
model ºó·µ»Ø¡£
ÎÒÃÇÉÏÃæÒѾ˵¹ý£¬¿ÉÒÔ½« Promise ¿´×÷ÊÇ¶Ô Result µÄ·â×°£¬¶øÕâÀïÎÒÃÇÒÀÈ»¿ÉÒÔÀà±È½øÐÐÀí½â£¬½«
async ¿´×÷ÊÇ¶Ô Promise µÄ·â×°¡£¶ÔÓÚsendAsync ·½·¨£¬ÎÒÃÇÍêÈ«¿ÉÒÔ½«ËüÀí½â·µ»Ø Promise£¬Ö»²»¹ýÅäºÏ
await£¬Õâ¸ö Promise ½«Ö±½ÓÒÔͬ²½µÄ·½Ê½±»½â°üΪ½á¹û¡£(»òÕß˵£¬await ÊÇÕâÑùÒ»¸ö¹Ø¼ü×Ö£¬Ëü¿ÉÒԵȴý
Promise Íê³É£¬²¢»ñÈ¡ËüµÄ½á¹û¡£)

²»½öÔÚÍøÂçÇëÇóÖпÉÒÔʹÓ㬶ÔÓÚËùÓÐµÄ I/O ²Ù×÷£¬Cocoa Ó¦µ±Ò²»áÌṩһÌ×¶ÔÓ¦µÄÒì²½ API¡£ÉõÖÁÓÚ¶ÔÓڵȴýÓû§²Ù×÷ºÍÊäÈ룬»òÕߵȴýij¸ö¶¯»µÄ½áÊø£¬¶¼ÊÇ¿ÉÒÔʹÓÃ
async/await µÄDZÔÚ³¡¾°¡£Èç¹ûÄã¶ÔÏìӦʽ±à³ÌÓÐËùÁ˽âµÄ»°£¬²»ÄÑ·¢ÏÖ£¬ÆäʵÏìӦʽ±à³ÌÏëÒª½â¾öµÄ¾ÍÊÇÒì²½´úÂëÄÑÒÔά»¤µÄÎÊÌ⣬¶øÔÚʹÓÃ
async/await ºó£¬²¿·ÖµÄÒì²½´úÂë¿ÉÒÔ±äΪÒÔͬ²½ÐÎʽÊéд£¬Õâ»áÈôúÂëÊéдÆðÀ´¼òµ¥ºÜ¶à¡£
Swift µÄ async ºÍ await ºÜ¿ÉÄܽ«»áÊÇ»ùÓÚ Coroutine ½øÐÐʵÏֵġ£²»¹ýÒ²ÓпÉÄܺÍ
C# ÀàËÆ£¬±àÒëÆ÷ͨ¹ý½« async ºÍ await µÄ´úÂë±àÒëΪ´øÓÐ״̬»úµÄƬ¶Î£¬²¢½øÐе÷¶È¡£Swift
5 µÄÔ¤¼Æ·¢²¼Ê±¼ä»áÊÇ 2018 Äêµ×£¬ËùÒÔÏÖÔÚ̸ÂÛÕâЩ¼¼Êõϸ½Ú¿ÉÄÜ»¹ÎªÊ±¹ýÔç¡£
²ÎÓëÕß (actor) Ä£ÐÍ
½²Á˰ëÌì async ºÍ await£¬ËüÃÇËùÒª½â¾öµÄÊÇÒì²½±à³ÌµÄÎÊÌâ¡£¶ø´ÓÒì²½±à³Ìµ½²¢Ðбà³Ì£¬ÎÒÃÇ»¹ÐèÒªÒ»²½£¬ÄǾÍÊǽ«¶à¸öÒì²½²Ù×÷×éÖ¯ÆðÀ´Í¬Ê±½øÐС£µ±È»£¬ÎÒÃÇ¿ÉÒÔ¼òµ¥µØÍ¬Ê±µ÷Óöà¸ö
async ·½·¨À´½øÐв¢ÐÐÔËË㣬»òÕßÊÇʹÓÃijЩÏñÊÇ GCD Àï group Ö®ÀàµÄÌØÊâÓï·¨À´½«¸´Êý¸ö async´ò°ü·ÅÔÚÒ»Æð½øÐе÷Óᣵ«ÊDz»ÂÛºÎÖÖ·½Ê½£¬¶¼»áÃæÁÙÒ»¸öÎÊÌ⣬ÄǾÍÊÇÕâÌ×·½Ê½Ê¹ÓõÄÊÇÃüÁîʽ
(imperative) µÄÓï·¨£¬¶ø·ÇÃèÊöÐ﵀ (declarative)£¬Õ⽫µ¼ÖÂÀ©Õ¹ÆðÀ´Ïà¶ÔÀ§ÄÑ¡£
²¢Ðбà³ÌÏà¶Ô¸´ÔÓ£¬¶øÇÒÓëÈËÀàÌìÉúµÄ˼¿¼·½Ê½ÏàÎ¥±³£¬ËùÒÔÎÒÃÇÏ£Íû¾¡¿ÉÄÜÈò¢Ðбà³ÌµÄÄ£Ðͱ£³Ö¼òµ¥£¬Í¬Ê±±ÜÃâÖ±½ÓÓëÏ̻߳òÕßµ÷¶ÈÕâÀàÊÂÎñ´ò½»µÀ¡£»ùÓÚÕâЩ¿¼ÂÇ£¬Swift
ºÜ¿ÉÄÜ»á²Î¿¼ Erlang ºÍ AKKA ÖÐÒѾºÜ³É¹¦µÄ²ÎÓëÕßÄ£ÐÍ (actor model) µÄ·½Ê½ÊµÏÖ²¢Ðбà³Ì£¬ÕâÑù¿ª·¢Õß½«¿ÉÒÔʹÓÃĬÈϵķֲ¼Ê½·½Ê½ºÍÃèÊöÐÔµÄÓïÑÔÀ´½øÐв¢ÐÐÈÎÎñ¡£
Ëùν²ÎÓëÕߣ¬ÊÇÒ»ÖÖ³ÌÐòÉϵijéÏó¸ÅÄËü±»ÊÓΪ²¢·¢ÔËËãµÄ»ù±¾µ¥Ôª¡£²ÎÓëÕßÄÜ×öµÄÊÂÇé¾ÍÊǽÓÊÕÏûÏ¢£¬²¢ÇÒ»ùÓÚÊÕµ½µÄÏûÏ¢×öijÖÖÔËËã¡£ÕâºÍÃæÏò¶ÔÏóµÄÏë·¨ÓÐÏàËÆÖ®´¦£¬Ò»¸ö¶ÔÏóÒ²½ÓÊÕÏûÏ¢
(»òÕß˵£¬½ÓÊÜ·½·¨µ÷ÓÃ)£¬²¢ÇÒ¸ù¾ÝÏûÏ¢ (±»µ÷Óõķ½·¨) ×÷³öÏìÓ¦¡£ËüÃÇÖ®¼ä×î´óµÄ²»Í¬ÔÚÓÚ£¬²ÎÓëÕßÖ®¼äÓÀÔ¶Ï໥¸ôÀ룬ËüÃDz»»á¹²Ïíij¿éÄÚ´æ¡£Ò»¸ö²ÎÓëÕßÖеÄ״̬ÓÀÔ¶ÊÇ˽Óеģ¬Ëü²»Äܱ»ÁíÒ»¸ö²ÎÓëÕ߸ı䡣
ºÍÃæÏò¶ÔÏóÊÀ½çÖС°ÍòÎï½Ô¶ÔÏó¡±µÄ˼ÏëÏàͬ£¬²ÎÓëÕßģʽÀËùÓеĶ«Î÷Ò²¶¼ÊDzÎÓëÕß¡£µ¥¸öµÄ²ÎÓëÕßÄÜÁ¦Ê®·ÖÓÐÏÞ£¬²»¹ýÎÒÃÇ¿ÉÒÔ´´½¨Ò»¸ö²ÎÓëÕߵġ°¹ÜÀíÕß¡±£¬»òÕß½Ð×ö
actor system£¬ËüÔÚ½ÓÊÕµ½Ìض¨ÏûϢʱ¿ÉÒÔ´´½¨ÐµIJÎÓëÕߣ¬²¢ÏòËüÃÇ·¢ËÍÏûÏ¢¡£ÕâЩеIJÎÓëÕß½«Êµ¼Ê¸ºÔðÔËËã»òÕß²Ù×÷£¬ÔÚ½Óµ½ÏûÏ¢ºó¸ù¾Ý×ÔÉíµÄÄÚ²¿×´Ì¬½øÐй¤×÷¡£ÔÚ
Swift 5 ÖУ¬¿ÉÄÜ»áÓÃÏÂÃæµÄ·½Ê½À´¶¨ÒåÒ»¸ö²ÎÓëÕߣº

ÔÙ´Î×¢Ò⣬ÕâЩ´úÂëÖ»ÊÇ¶Ô Swift 5 ÖпÉÄܳöÏֵIJÎÓëÕßģʽµÄÒ»ÖÖ²ÂÏë¡£×îºóµÄʵÏֿ϶¨»áºÍÕâÓÐËùÇø±ð¡£²»¹ýÈç¹û
Swift ÖÐÒª¼ÓÈë²ÎÓëÕߣ¬Ó¦¸Ã»áºÍÕâÀïµÄ±íÊöÀàËÆ¡£
ÕâÀïµÄ Message ÊÇÎÒÃǶ¨ÒåµÄÏûÏ¢ÀàÐÍ¡£
ʹÓà actor ¹Ø¼ü×ÖÀ´¶¨ÒåÒ»¸ö²ÎÓëÕßÄ£ÐÍ£¬ËüÆäÖаüº¬ÁËÄÚ²¿×´Ì¬ºÍÒì²½²Ù×÷£¬ÒÔ¼°Ò»¸öÒþʽµÄ²Ù×÷¶ÓÁС£
¶¨ÒåÁËÕâ¸ö actor ÐèÒª½ÓÊÕµÄÏûÏ¢ºÍÐèÒª×÷³öµÄÏìÓ¦¡£
´´½¨ÁËÒ»¸ö actor system (ActorSystem ÕâÀïûÓиø³öʵÏÖ£¬¿ÉÄÜ»á°üº¬ÔÚ Swift
±ê×¼¿âÖÐ)¡£È»ºó´´½¨ÁËÒ»¸ö NetworkRequestHandler ²ÎÓëÕߣ¬²¢ÏòËü·¢ËÍÒ»ÌõÏûÏ¢¡£
Õâ¸ö²ÎÓëÕß·â×°ÁËÒ»¸öÒì²½·½·¨ÒÔ¼°Ò»¸öÄÚ²¿×´Ì¬£¬ÁíÍ⣬ÒòΪ¸Ã²ÎÓëÕß»áʹÓÃÒ»¸ö×Ô¼ºµÄ DispatchQueue
ÒÔ±ÜÃâºÍÆäËûÏ̹߳²Ïí״̬¡£Í¨¹ý actor system ½øÐд´½¨£¬²¢ÔÚ½ÓÊÕµ½Ä³¸öÏûÏ¢ºóÖ´ÐÐÒì²½µÄÔËËã·½·¨£¬ÎÒÃǾͿÉÒÔºÜÈÝÒ×µØÐ´³ö²¢Ðд¦ÀíµÄ´úÂ룬¶ø²»±Ø¹ØÐÄËüÃǵÄÄÚ²¿×´Ì¬ºÍµ÷¶ÈÎÊÌâÁË¡£ÏÖÔÚ£¬Äã¿ÉÒÔͨ¹ý
ActorSystem À´´´½¨ºÜ¶à²ÎÓëÕߣ¬È»ºó·¢ËͲ»Í¬ÏûÏ¢¸øËüÃÇ£¬²¢½øÐи÷×ԵIJÙ×÷¡£²¢Ðбà³Ì±äµÃǰËùδÓеļòµ¥¡£
²ÎÓëÕßģʽÏà±ÈÓÚ´«Í³µÄ×Ô¼ºµ÷¶ÈÓÐÁ½¸öÏÔÖøµÄÓŵ㣺
Ê×ÏÈ£¬ÒòΪ²ÎÓëÕßÖ®¼äµÄͨѶÊÇÏûÏ¢·¢ËÍ£¬ÕâÒâζ×Ų¢ÐÐÔËËã²»±Ø±»¾ÖÏÞÔÚÒ»¸ö½ø³ÌÀÉõÖÁ²»±Ø¾ÖÏÞÔÚһ̨É豸Àï¡£Ö»Òª±£Ö¤ÏûÏ¢Äܹ»±»·¢ËÍ
(±ÈÈçʹÓà IPC »òÕß DMA)£¬Äã¾ÍÍêÈ«¿ÉÒÔʹÓ÷ֲ¼Ê½µÄ·½Ê½£¬Ê¹ÓöàÖÖÉ豸 (¶ą̀µçÄÔ£¬»òÕß¶à¸ö GPU)
½øÐв¢ÐвÙ×÷£¬Õâ´øÀ´µÄÊÇÎÞÏÞ¿ÉÄܵÄÀ©Õ¹ÐÔ¡£
ÁíÍ⣬ÓÉÓÚ²ÎÓëÕßÖ®¼ä¿ÉÒÔ·¢ËÍÏûÏ¢£¬ÄÇЩ²Ù×÷·¢ÉúÒì³£µÄ²ÎÓëÕßÓлú»á֪ͨ system ×Ô¼ºµÄ״̬£¬¶ø actor
system Ò²¿ÉÒÔ¸ù¾ÝÕâ¸ö״̬À´ÖØÖÃÕâЩ³öÎÊÌâµÄ²ÎÓëÕߣ¬»òÕßÉõÖÁÊÇÎÞÊÓËüÃDz¢´´½¨ÐµIJÎÓëÕß¼ÌÐøÈÎÎñ¡£ÕâʹµÃÕû¸ö²ÎÓëÕßϵͳӵÓС°×ÔÓú¡±µÄÄÜÁ¦£¬ÔÚ´«Í³²¢Ðбà³ÌÖÐÏëÒª´¦ÀíÕâ¼þÊÂÇéÊǷdz£À§Äѵ쬶ø²ÎÓëÕßÄ£Ð͵ÄϵͳµÃÒæÓÚ´Ë£¬¿ÉÒÔ×î´óÏ޶ȱ£ÕÏϵͳµÄÎȶ¨ÐÔ¡£
ÕâЩ¶«Î÷ÓÐʲôÓÃ
Á½ÄêÏÂÀ´£¬Swift ÒѾ֤Ã÷ÁË×Ô¼ºÊÇÒ»Ãŷdz£ÓÅÐãµÄ app ÓïÑÔ¡£¼´Ê¹ Xcode ÿÈÕŰÎÒǧ°Ù±é£¬µ«ÊÇÏÖÔÚÈÃÎÒ»ØÈ¥Ð´
Objective-C µÄ»°£¬ÎÒ´ÓÄÚÐÄÊǾø¶Ô¿¹¾ÜµÄ¡£Swift µÄÒ°ÐIJ»½öÓÚ´Ë£¬´Ó Swift µÄ¿ªÔ´ºÍ½ø»¯·½Ïò£¬ÎÒÃǺÜÈÝÒ׿´³öÕâÃÅÓïÑÔÏ£ÍûÔÚ·þÎñÆ÷¶ËÒ²ÓÐËù½¨Ê÷¡£¶øÄÚ½¨µÄÒì²½Ö§³ÖÒÔ¼°²ÎÓëÕßģʽµÄ²¢Ðбà³Ì£¬ÎÞÒÉ»áΪ
Swift ÔÚ·þÎñÆ÷¶ËµÄÔËÓÃÌí¼ÓºñÖØµÄíÀÂë¡£Ò첽ģÐͶÔд app Ò²»áÓÐËù°ïÖú£¬¸ü¼ò»¯µÄ¿ØÖÆÁ÷³ÌÒÔ¼°Òþ²ØÆðÀ´µÄÏß³ÌÇл»£¬»áÈÃÎÒÃÇд³ö¸ü¼Ó¼òÃ÷ÓÅÑŵĴúÂë¡£
C# µÄ async/await Ôø¾Îª¿ª·¢ÕßÃÇ´øÀ´Ò»¹ÉÇåÁ÷£¬Elixir »òÕß˵ Erlang ¿ÉÒÔ˵ÊÇÊÀ½çÉÏ×îÓÅÐãµÄ²¢Ðбà³ÌÓïÑÔ£¬JVM
É쵀 AKKA Ò²ÕýÔÚÖ§³Å×ÅÎÞÊýµÄÒÚ¼¶·þÎñ¡£ÎÒºÜºÃÆæµ± Swift Óöµ½ÕâÒ»ÇеÄʱºò£¬ËüÃÇÖ®¼äµÄ»¯Ñ§·´Ó¦»á±Å·¢³öÔõÑùµÄ»ð»¨¡£ËäȻÿÌ컹ÔÚ
Swift 3 µÄÊÀ½çÖÐÕõÔú£¬µ«ÊÇÎÒÏëÎÒµÄÐÄÒѾ·ÉÔ¾µ½ Swift 5 µÄ²¢ÐÐÊÀ½çÖÐÈ¥ÁË¡£ |