Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
iOSÓ¦Óüܹ¹Ì¸--ÍøÂç²ãÉè¼Æ·½°¸
 
×÷ÕߣºÌïΰÓî À´×ÔÓÚ£ºInfoQQ ·¢²¼ÓÚ 2015-8-13
 

±àÕß°´£ºiOS¿Í»§¶ËÓ¦Óüܹ¹¿´ËƼòµ¥£¬µ«Êµ¼ÊÉÏÒª¿¼ÂǵÄÊÂÇé²»ÉÙ¡£±¾ÎÄ×÷Õß½«ÒÔϵÁÐÎÄÕµÄÐÎʽÀ´ÌÖÂÛiOSÓ¦Óüܹ¹ÖеÄÖÖÖÖÎÊÌ⣬±¾ÎÄÊÇÆäÖеĵÚÈýƪ£¬Ö÷Òª½²ÍøÂç²ãÉè¼ÆÒÔ¼°°²È«»úÖÆºÍÓÅ»¯·½°¸¡£

ǰÑÔ

ÍøÂç²ãÔÚÒ»¸öAppÖÐÒ²ÊÇÒ»¸ö²»¿ÉȱÉٵIJ¿·Ö£¬¹¤³ÌʦÃÇÔÚÍøÂç²ãÄܹ»·¢»ÓµÄ¿Õ¼äÒ²±È½Ï´ó¡£ÁíÍ⣬ƻ¹û¶ÔÍøÂçÇëÇ󲿷ÖÒѾ­×öÁ˺ܺõķâ×°£¬Òµ½çµÄAFNetworkingÒ²±»¹ã·ºÊ¹Óá£ÆäËüµÄASIHttpRequest£¬MKNetworkKitɶµÄÆäʵҲ¶¼»¹²»´í£¬µ«Ç°ÕßÒѾ­Æú¿Ó£¬ºóÕßÒ²ÔÚÆú¿ÓµÄ±ßÔµ¡£ÔÚʵ¼ÊµÄApp¿ª·¢ÖУ¬AfnetworkingÒѾ­³ÉΪÁËÊÂʵÉϸ÷´óAppµÄ±ê×¼ÅäÖá£

ÍøÂç²ãÔÚÒ»¸öAppÖгÐÔØÁËAPIµ÷Óã¬Óû§²Ù×÷ÈÕÖ¾¼Ç¼£¬ÉõÖÁÊǼ´Ê±Í¨Ñ¶µÈÈÎÎñ¡£ÎÒ½Ó´¥¹ýһЩApp£¨¿ªÔ´µÄºÍ²»¿ªÔ´µÄ£©µÄ´úÂ룬ÔÚ¿´µ½ÍøÂç²ãÕâÒ»¿éʱ£¬ÓÈÆäÊÇÔÚ¿´µ½¸÷λ¼Ü¹¹Ê¦¸÷ÏÔÉñͨչʾÁ˸÷ÖÖ¼¼ÇÉ£¬Îҷdz£ÎªÖ®¸Ðµ½ÐË·Ü¡£µ«ÓеÄʱºò£¬ÍùÍùÒ²¶ÔÓÚÆäÖеÄһЩȱÏݸе½Ê§Íû¡£

¹ØÓÚÍøÂç²ãµÄÉè¼Æ·½°¸»áÓкܶ࣬ÐèҪȨºâµÄµØ·½Ò²»áÓкܶ࣬ÉõÖÁÓÚÕùÒéµÄµØ·½¶¼»áÓкܶࡣµ«ÎÞÂÛÈçºÎ£¬ÎÒ¶¼²»»á¶ÔÕâЩÎÊÌâ×ö³öÈκÎÌӱܣ¬ÎÒ»áÔÚÕâÆªÎÄÕÂÖиø³öÎÒ¶ÔËüÃǵĿ´·¨ºÍ½â¾ö·½°¸£¬¹Ûµã¾ø²»ÖÐÁ¢£¬²»»á¸ú´ó¼Ò´òÌ«¼«¡£

ÕâÆªÎÄÕ¾ÍÖ÷Òª»á½²ÕâЩ·½Ã棺

ÍøÂç²ã¸úÒµÎñ¶Ô½Ó²¿·ÖµÄÉè¼Æ

ÍøÂç²ãµÄ°²È«»úÖÆÊµÏÖ

ÍøÂç²ãµÄÓÅ»¯·½°¸

ÍøÂç²ã¸úÒµÎñ¶Ô½Ó²¿·ÖµÄÉè¼Æ

ÔÚ°²¾Ó¿ÍAppµÄ¼Ü¹¹¸üл»´úµÄʱºò£¬ÎÒÉîÉîµØ¸Ð¾õµ½ÍøÂç²ã¸úÒµÎñ¶Ô½Ó²¿·ÖµÄÉè¼ÆÓжàÃ´ÖØÒª£¬Òò´ËÎÒ¶ÔËü×öµÄ×î´ó¸Ä±ä¾ÍÊÇÕë¶ÔÍøÂç²ã¸úÒµÎñ¶Ô½Ó²¿·ÖµÄ¸Ä±ä¡£ÍøÂç²ã¸úÒµÎñ²ã¶Ô½Ó²¿·ÖÉè¼ÆµÄºÃ»µ£¬»áÖ±½ÓÓ°Ïìµ½ÒµÎñ¹¤³ÌʦʵÏÖ¹¦ÄÜʱµÄÐÄÇé¡£

ÔÚÕýʽ¿ªÊ¼½²Éè¼ÆÖ®Ç°£¬ÎÒÃÇÒªÏÈÌÖÂÛ¼¸¸öÎÊÌ⣺

ʹÓÃÄÄÖÖ½»»¥Ä£Ê½À´¸úÒµÎñ²ã×ö¶Ô½Ó£¿

ÊÇ·ñÓбØÒª½«API·µ»ØµÄÊý¾Ý·â×°³É¶ÔÏóÈ»ºóÔÙ½»¸¶¸øÒµÎñ²ã£¿

ʹÓü¯Ô¼»¯µ÷Ó÷½Ê½»¹ÊÇÀëÉ¢Ð͵÷Ó÷½Ê½È¥µ÷ÓÃAPI£¿

ÕâЩÎÊÌâÌÖÂÛÍê±ÏÖ®ºó£¬ÎÒ»á¸ø³öÒ»¸öÍêÕûµÄÉè¼Æ·½°¸À´¸ø´ó¼Ò×ö²Î¿¼£¬Éè¼Æ·½°¸ÊÇÓ㣬ÌÖÂÛµÄÕâЩÎÊÌâÊÇÓæ£¬ÎÒʲô¶¼ÊÚÁË£¬´ó¼Ò¸÷È¡ËùÐè¡£

ʹÓÃÄÄÖÖ½»»¥Ä£Ê½À´¸úÒµÎñ²ã×ö¶Ô½Ó£¿

ÕâÀïÆäʵÓÐÁ½¸öÎÊÌ⣺һ£¬ÒÔʲô·½Ê½½«Êý¾Ý½»¸¶¸øÒµÎñ²ã£¿¶þ£¬½»¸¶Ê²Ã´ÑùµÄÊý¾Ý¸øÒµÎñ²ã£¿

ÒÔʲô·½Ê½½«Êý¾Ý½»¸¶¸øÒµÎñ²ã£¿

iOS¿ª·¢ÁìÓòÓкܶà¶ÔÏó¼äÊý¾ÝµÄ´«µÝ·½Ê½£¬ÎÒ¿´µ½µÄ´ó¶àÊýAppÔÚÍøÂç²ãËù²ÉÓõķ½°¸Ö÷Òª¼¯ÖÐÓÚÕâÈýÖÖ£ºDelegate£¬Notification£¬Block¡£KVOºÍTarget-ActionÎÒĿǰ»¹Ã»Óп´µ½ÓÐʹÓõġ£

ĿǰÎÒÖªµÀ±ß·æÖ÷ÒªÊDzÉÓõÄblock£¬´óÖÇ»ÛÖ÷Òª²ÉÓõÄÊÇNotification£¬°²¾Ó¿ÍÔçÆÚÒÔBlockΪÖ÷£¬ºóÃæ¸Ä³ÉÁËÒÔDelegateΪÖ÷£¬°¢Àïû·¢ÏÖÓÐͨ¹ýNotificationÀ´×öÊý¾Ý´«µÝµÄµØ·½£¨¿ÉÄÜÓУ©£¬Delegate¡¢BlockÒÔ¼°target-action¶¼ÓУ¬°¢ÀïiOS AppÍøÂç²ãµÄ×÷Õß˵ÕâÊÇΪÁË·½±ãÒµÎñ²ãÑ¡Ôñ×Ô¼ººÏÊʵķ½·¨È¥Ê¹Óá£ÕâÀï´ó¼Ò¶¼ÊǸ÷ÏÔÉñͨ£¬Ã¿´ÎÎÒ¿´µ½Õⲿ·ÖµÄʱºò£¬ÎÒ¶¼Ï²»¶ÎÊ×÷ÕßΪʲô²ÉÓÃÕâÖÖ½»»¥·½°¸£¬µ«ºÜÉÙÓÐ×÷ÕßÄܹ»Ëµ³ö¸öÌõÌõ¿ò¿òÀ´¡£

È»¶øÔÚÎÒÕâ±ß£¬ÎÒµÄÒâ¼ûÊÇÒÔDelegateΪÖ÷£¬NotificationΪ¸¨¡£Ô­ÒòÈçÏ£º

¾¡¿ÉÄܼõÉÙ¿ç²ãÊý¾Ý½»Á÷µÄ¿ÉÄÜ£¬ÏÞÖÆñîºÏ

ͳһ»Øµ÷·½·¨£¬±ãÓÚµ÷ÊÔºÍά»¤

ÔÚ¸úÒµÎñ²ã¶Ô½ÓµÄ²¿·ÖÖ»²ÉÓÃÒ»ÖÖ¶Ô½ÓÊֶΣ¨ÔÚÎÒÕâ¶ù¾ÍÊÇÖ»²ÉÓÃdelegateÕâÒ»¸öÊֶΣ©ÏÞÖÆÁé»îÐÔ£¬ÒÔ´ËÀ´½»»»Ó¦ÓõĿÉά»¤ÐÔ

¾¡¿ÉÄܼõÉÙ¿ç²ãÊý¾Ý½»Á÷µÄ¿ÉÄÜ£¬ÏÞÖÆñîºÏ

ʲô½Ð¿ç²ãÊý¾Ý½»Á÷£¿¾ÍÊÇijһ²ã£¨»òÄ£¿é£©¸úÁíÍâµÄÓë֮ûÓÐÖ±½Ó¶Ô½Ó¹ØÏµµÄ²ã£¨»òÄ£¿é£©²úÉúÁËÊý¾Ý½»»»¡£ÎªÊ²Ã´ÕâÖÖÇé¿ö²»ºÃ£¿ÑϸñÀ´ËµÓ¦¸ÃÊǴ󲿷ÖÇé¿ö¶¼²»ºÃ£¬ÓеÄʱºò¿ç²ãÊý¾Ý½»Á÷ȷʵҲÊÇÒ»ÖÖÐèÇó¡£Ö®ËùÒÔ˵²»ºÃµÄµØ·½ÔÚÓÚ£¬Ëü»áµ¼Ö´úÂë»ìÂÒ£¬ÆÆ»µÄ£¿éµÄ·â×°ÐÔ¡£ÎÒÃÇÔÚ×ö·Ö²ã¼Ü¹¹µÄÄ¿µÄÆäÖÐÖ®Ò»¾ÍÔÚÓÚϲã¶ÔÉϲãÓÐÒ»´Î³éÏó£¬ÈÃÉϲã¿ÉÒÔ²»±Ø¹ØÐÄϲãϸ½Ú¶øÖ´ÐÐ×Ô¼ºµÄÒµÎñ¡£

ËùÒÔ£¬Èç¹ûϲãϸ½Ú±»¿ç²ã±©Â¶£¬Ò»·½ÃæÄãºÜÈÝÒ×Òò´ËʧȥÁÚ²ã¶ÔÕâ¸ö±©Â¶Ï¸½ÚµÄ±£»¤£»ÁíÒ»·½Ã棬ÄãÓÖ²»¿ÉÄܲ»È¥´¦ÀíÕâ¸öϸ½Ú£¬ËùÒÔ´¦Àíϸ½ÚµÄÏà¹Ø´úÂë¾Í»áÉ¢Âä¸÷µØ£¬×îÖÕÄÑÒÔά»¤¡£

˵µÃ¾ßÏóÒ»µã¾ÍÊÇ£¬ÎÒÃÇ¿¼ÂÇÕâÑùÒ»ÖÖÇé¿ö£ºA<-B<-C¡£µ±CÓÐʲôʼþ£¬Í¨¹ýijÖÖ·½Ê½¸æÖªB£¬È»ºóBÖ´ÐÐÏàÓ¦µÄÂß¼­¡£Ò»µ©¸æÖª·½Ê½²»ºÏÀí£¬ÈÃAÓÐÁË¿ç²ãÖªµÀCµÄʼþµÄ¿ÉÄÜ£¬Ä㠾ͺÜÄѱ£Ö¤A²ãÒµÎñ¹¤³ÌʦÔÚ½«À´²»»á¶ÔÕâ¸öϸ½Ú×÷´¦Àí¡£Ò»µ©ÒµÎñ¹¤³ÌʦÔÚA²ã²úÉú´¦Àí²Ù×÷£¬ÓпÉÄÜÊDz¹³äÂß¼­£¬Ò²ÓпÉÄÜÊÇÖ´ÐÐÒµÎñ£¬ÄÇôÕâ¸öϸ½ÚµÄÏà¹Ø´¦Àí´úÂë¾Í»áÓÐÒ»²¿·ÖÉ¢ÂäÔÚA²ã¡£È»¶øÇ°ÕßÊDz»Ó¦¸ÃÉ¢ÂäÔÚA²ãµÄ£¬ºóÕßÓпÉÄÜÊÇÐèÇó¡£ÁíÍ⣬ÒòΪB²ãÊǶÔA²ã³éÏóµÄ£¬Ö´Ðв¹³äÂß¼­µÄʱºò£¬ÓпÉÄܺÍB²ãÕë¶ÔÕâ¸öʼþµÄ´¦ÀíÂß¼­²úÉú³åÍ»£¬ÕâÊÇÎÒÃǺܲ»Ï£Íû¿´µ½µÄ¡£

ÄÇôʲôÇé¿ö¿ç²ãÊý¾Ý½»Á÷»á³ÉΪÐèÇó£¿ÔÚÍøÂç²ãÕâ±ß£¬ÐźŴÓ2G±ä³É3G±ä³É4G±ä³ÉWi-Fi£¬Õâ¸öÊÇ¿ç²ãÊý¾Ý½»Á÷µÄÆäÖÐÒ»¸öÐèÇó¡£²»¹ýÆäËûµÄ¿ç²ãÊý¾Ý½»Á÷ÐèÇóÎÒÔÝʱҲÏë²»µ½ÁË£¬¹þ¹þ£¬Ó¦¸ÃÒ²¾ÍÕâÒ»¸ö°É¡£

ÑϸñÀ´Ëµ£¬Ê¹ÓÃNotificationÀ´½øÐÐÍøÂç²ãºÍÒµÎñ²ãÖ®¼äÊý¾ÝµÄ½»»»£¬²¢²»´ú±íÕâÒ»¶¨¾ÍÊÇ¿ç²ãÊý¾Ý½»Á÷£¬µ«ÊÇʹÓÃNotification¸ø¿ç²ãÊý¾Ý½»Á÷¿ªÁËÒ»µÀ¿Ú×Ó£¬ÒòΪNotificationµÄÓ°ÏìÃæ²»¿É¿ØÖÆ£¬Ö»Òª´æÔÚʵÀý¾Í´æÔÚ±»Ó°ÏìµÄ¿ÉÄÜ¡£ÁíÍ⣬ÕâÒ²»áµ¼ÖÂË­¶¼²»Äܱ£Ö¤Ïà¹Ø´¦Àí´úÂë¾ÍÔÚΨһµÄÄǸöµØ·½£¬½ø¶ø´øÀ´Î¬»¤ÔÖÄÑ¡£×÷Ϊ¼Ü¹¹Ê¦£¬ÔÚÕâÀï¸øÒµÎñ¹¤³ÌʦÏÞÖÆÆä²Ù×÷µÄÁé»îÐÔÊDZØÒªµÄ¡£ÁíÍ⣬NotificationÒ²Ö§³ÖÒ»¶Ô¶àµÄÇé¿ö£¬ÕâÒ²¸ø´úÂëÉ¢ÂäÌṩÁËÌõ¼þ¡£Í¬Ê±£¬NotificationËù¶ÔÓ¦µÄÏìÓ¦·½·¨ºÜÄÑÔÚ±àÒë²ãÃæ×÷ÏÞÖÆ£¬²»Í¬µÄÒµÎñ¹¤³Ìʦ»á¸øËûÈ¡²»Í¬µÄÃû×Ö£¬ÕâÒ²»á¸ø´úÂëµÄ¿Éά»¤ÐÔ´øÀ´ÔÖÄÑ¡£

ÊÖ»úÌÔ±¦¼Ü¹¹×éµÄÏÀÎäÍ¬Ñ§Ôø¾­¸øÎÒ·ÖÏí¹ýÒ»¸öÎÊÌ⣬ÔÚÕâÀïÎÒÒ²·ÖÏí¸ø´ó¼Ò£ºÔø¾­ÓÐÒ»¸ö¹¤³ÌʦÔÚ¼àÌýNotificationÖ®ºó£¬Ã»ÓÐдÊͷżàÌýµÄ´úÂ룬µ±È»£¬ÕÒµ½Õâ¸öÔ­ÒòÓÖÊǺÜÂþ³¤µÄÒ»¶Î¹ÊÊ£¬ÏÖÔÚÕÒµ½Ô­ÒòÁË£¬È»¶ø¼àÌýÕâ¸öNotificationµÄ¶ÔÏóÓÐÄÇô¶à£¬²»ÖªµÀ¾ßÌåÊÇÄĸöNotificaiton£¬Ò²²»ÖªµÀÄǸöûÊͷżàÌýµÄ¶ÔÏóÊÇË­¡£ºóÀ´ÕÛÌÚÁ˺ܾôó¼Ò¶¼Ã»°ì·¨µÄʱºò£¬ÓÐÒ»¸ö¾­Ñé·á¸»µÄ¹¤³ÌʦÌá³öÓÃhook£¨Method Swizzling£©µÄ·½Ê½£¬×îÖÕÕÒµ½ÁËÄǸöûÊͷżàÌýµÄ¶ÔÏó£¬bugÐÞ¸´ÁË¡£

ÎÒ·ÖÏíÕâ¸öÎÊÌâµÄÄ¿µÄ²¢²»ÊÇÏëÇ¿µ÷Notification¶àô¶àô²»ºÃ£¬Notification±¾Éí¾ÍÊÇÒ»ÖÖÉè¼ÆÄ£Ê½£¬ÔÚÊôÓÚËüµÄÎÊÌâÁìÓòÄÚ£¬NotificationÊǷdz£ºÃµÄÒ»ÖÖ½â¾ö·½°¸¡£µ«ÎÒÏëÇ¿µ÷µÄÊÇ£¬¶ÔÓÚÍøÂç²ãÕâ¸öÎÊÌâÁìÓòÄÚÀ´¿´£¬¼Ü¹¹Ê¦Ê×ÏÈÒ»¶¨ÒªÏÞÖÆ´úÂëµÄÓ°Ï췶Χ£¬ÔÚÄÜÓÃÓ°Ï췶ΧСµÄ·½°¸µÄʱºò¾Í¾¡Á¿²ÉÓÃÕâÖÖСµÄ·½°¸£¬·ñÔò½«À´ÒªÊÇÓÐÊ²Ã´Ææ¹ÖÐèÇó»òÕß³öÁËʲôСÎÊÌ⣬ά»¤ÆðÀ´¾Í·Ç³£Âé·³¡£Òò´ËNotificationÕâ¸ö·½°¸²»ÄÜ×÷ΪÊ×Ñ¡·½°¸£¬Ö»ÄÜ×÷Ϊ±¸Ñ¡¡£

ÄÇôNotificationÒ²²»ÊÇÍêÈ«²»ÄÜʹÓ㬵±ÐèÇóÒªÇó¿ç²ãʱ£¬ÎÒÃǾͿÉÒÔʹÓÃNotification£¬±ÈÈçÇ°ÃæÌáµ½µÄÍøÂçÌõ¼þÇл»£¬¶øÇÒÕâ¸öÐèÇóÒ²ÊÇÐèÒªÂú×ãÒ»¶Ô¶àµÄ¡£

ËùÒÔ£¬ÎªÁË·ûºÏÇ°ÃæËù˵µÄÕâЩҪÇó£¬Ê¹ÓÃDelegateÄܹ»ºÜºÃµØ±ÜÃâ¿ç²ã·ÃÎÊ£¬Í¬Ê±ÏÞÖÆÁËÏìÓ¦´úÂëµÄÐÎʽ£¬Ïà±ÈNotification¶øÑÔÓиüºÃµÄ¿Éά»¤ÐÔ¡£

È»ºóÎÒÃÇ˳±ãÀ´ËµËµÎªÊ²Ã´¾¡Á¿²»ÒªÓÃblock

1. blockºÜÄÑ×·×Ù£¬ÄÑÒÔά»¤

ÎÒÃÇÔÚµ÷ÊÔµÄʱºò¾­³£»áµ¥²½×·×Ùµ½Ä³Ò»¸öµØ·½Ö®ºó£¬·¢ÏÖÄáÂêÕâÀïÓиöblock£¬Èç¹ûÏëÖªµÀÕâ¸öblockÀïÃæ¶¼×öÁËЩʲôÊÂÇ飬Õâʱºò¾Í±È½Ïµ°ÌÛÁË¡£

- (void)someFunctionWithBlock:(SomeBlock *)block
{
... ...

-> block(); //µ±Äãµ¥²½×ßµ½Õâ¶ùµÄʱºò£¬ÒªÏëÖªµÀblockÀïÃæ¶¼×öÁËÄÄЩÊÂÇéµÄ»°£¬¾ÍºÜÂé·³¡£

... ...
}

2. block»áÑÓ³¤Ïà¹Ø¶ÔÏóµÄÉúÃüÖÜÆÚ

block»á¸øÄÚ²¿ËùÓеĶÔÏóÒýÓüÆÊý¼ÓÒ»£¬ÕâÒ»·½Ãæ»á´øÀ´Ç±ÔÚµÄretain cycle£¬²»¹ýÎÒÃÇ¿ÉÒÔͨ¹ýWeak SelfµÄÊֶνâ¾ö¡£ÁíÒ»·½Ãæ±È½ÏÖØÒª¾ÍÊÇ£¬Ëü»áÑÓ³¤¶ÔÏóµÄÉúÃüÖÜÆÚ¡£

ÔÚÍøÂç»Øµ÷ÖÐʹÓÃblock£¬ÊÇblockµ¼Ö¶ÔÏóÉúÃüÖÜÆÚ±»ÑÓ³¤µÄÆäÖÐÒ»¸ö³¡ºÏ£¬µ±ViewController´ÓwindowÖÐжÏÂʱ£¬Èç¹ûÉÐÓÐÇëÇó´ø×ÅblockÔÚÍâÃæ·É£¬È»ºóblockÀïÃæÒýÓÃÁËViewController£¨ÕâÖÖ³¡ºÏ·Ç³£³£¼û£©£¬ÄÇôViewControllerÊDz»Äܱ»¼°Ê±»ØÊյ쬼´±ãÄãÒѾ­È¡ÏûÁËÇëÇó£¬ÄÇÒ²»¹ÊDZØÐëµÃµÈµ½ÇëÇó׎֮ºó²ÅÄܱ»»ØÊÕ¡£

È»¶øÊ¹ÓÃdelegate¾Í²»»áÓÐÕâÑùµÄÎÊÌ⣬delegateÊÇÈõÒýÓã¬ÄÄÅÂÇëÇóÈÔÈ»ÔÚÍâÃæ·É£¬£¬ViewController»¹ÊÇÄܹ»¼°Ê±±»»ØÊյ쬻ØÊÕÖ®ºóÖ¸Õë×Ô¶¯±»ÖÃΪÁËnil£¬ÎÞÉË´óÑÅ¡£

ËùÒÔÆ½Ê±¾¡Á¿²»ÒªÀÄÓÃblock£¬ÓÈÆäÊÇÔÚÍøÂç²ãÕâÀï¡£

3. ͳһ»Øµ÷·½·¨£¬±ãÓÚµ÷ÊÔºÍά»¤

Ç°Ãæ½²µÄÊÇ¿ç²ãÎÊÌâ£¬Çø·ÖÁËDelegateºÍNotification£¬Ë³´øÌ¸ÁËÒ»ÏÂBlock¡£È»ºóÏÖÔÚ̸µ½µÄÕâ¸öÇé¿ö£¬¾ÍÊÇÁíÒ»¸ö²ÉÓÃBlock·½°¸²»ÊǺܺÏÊʵÄÇé¿ö¡£Ê×ÏÈ£¬Block±¾ÉíÎ޺ûµ¶Ô´íÖ®·Ö£¬Ö»ÓкÏÊʲ»ºÏÊÊ¡£ÔÚÕâÒ»½ÚÒª½²µÄÇé¿öÀBlockÎÞ·¨×öµ½»Øµ÷·½·¨µÄͳһ£¬µ÷ÊÔºÍά»¤µÄʱºòÒ²ºÜÄÑÔÚµ÷ÓÃÕ»ÉÏÏÔʾ³öÀ´£¬ÕÒµÄʱºò»áºÜµ°ÌÛ¡£

ÔÚÍøÂçÇëÇóºÍÍøÂç²ã½ÓÊÜÇëÇóµÄµØ·½Ê±£¬Ê¹ÓÃBlockûÎÊÌâ¡£µ«ÊÇÔÚ»ñµÃÊý¾Ý½»¸øÒµÎñ·½Ê±£¬×îºÃ»¹ÊÇͨ¹ýDelegateȥ֪ͨµ½ÒµÎñ·½¡£ÒòΪBlockËù°üº¬µÄ»Øµ÷´úÂë¸úµ÷ÓÃÂß¼­·ÅÔÚͬһ¸öµØ·½£¬»áµ¼ÖÂÄDz¿·Ö´úÂë±äµÃºÜ³¤£¬ÒòΪÕâÀïÃæ°üÀ¨Á˵÷ÓÃǰºÍµ÷ÓúóµÄÂß¼­¡£´ÓÁíÒ»¸ö½Ç¶È˵£¬ÕâÔÚÒ»¶¨³Ì¶ÈÉÏÎ¥±³ÁËsingle function£¬single taskµÄÔ­Ôò£¬ÔÚÐèÒªµ÷ÓÃAPIµÄµØ·½£¬¾ÍֻҪдAPIµ÷ÓÃÏà¹ØµÄ´úÂ룬Ôڻص÷µÄµØ·½£¬Ð´»Øµ÷µÄ´úÂë¡£

È»ºóÎÒ¿´µ½´ó²¿·ÖAppÀµ±ÒµÎñ¹¤³Ìʦд´úÂëдµ½Õâ±ßµÄʱºò£¬Ò²Òâʶµ½ÁËÕâ¸öÎÊÌâ¡£Òò´ËËûÃÇ»áÔÚblockÀïÃæÐ´¸öÒ»¾ä»°µÄ·½·¨½ÓÊÕ²ÎÊý£¬È»ºó×öת·¢£¬È»ºó¾Í¿ÉÒÔ°ÑÕâ¸ö·½·¨·ÅÔÚÆäËûµØ·½ÁË£¬ÈƹýÁËBlockµÄ»Øµ÷׎µã²»Í³Ò»µÄÇé¿ö¡£±ÈÈçÕâÑù£º

[API callApiWithParam:param successed:^(Response *response){
[self successedWithResponse:response];
} failed:^(Request *request, NSError *error){
[self failedWithRequest:request error:error];
}];

ÕâʵÖÊÉϸúʹÓÃDelegateµÄÊÖ¶ÎûÓÐÊ²Ã´Çø±ð£¬Ö»ÊÇÈÆÁËһϣ¬²»¹ý»¹ÊÇûÓнâ¾öͳһ»Øµ÷·½·¨µÄÎÊÌ⣬ÒòΪblockÀïÃæÐ´µÄ·½·¨Ãû×Ö¿ÉÄÜÔÚ²»Í¬µÄViewController¶ÔÏóÖж¼»á²»Ò»Ñù£¬±Ï¾¹ÒµÎñ¹¤³ÌʦҲÊǺܶàÈË£¬¸÷ÈËÓи÷È˵ÄÏë·¨¡£ËùÒԼܹ¹Ê¦ÔÚÕâ±ß²»ÒªÌ°Í¼·½±ã£¬»¹ÊÇʹÓÃdelegateµÄÊֶΰɣ¬ÒµÎñ¹¤³ÌʦÄDZ߾ÍÄܲ»ÓÃÄÇÃ´ÈÆÁË¡£BlockÊÇĿǰ´ó²¿·ÖµÚÈý·½ÍøÂç¿â¶¼²ÉÓõķ½Ê½£¬ÒòΪÔÚ·¢ËÍÇëÇóµÄÄÇÒ»²¿·Ö£¬Ê¹ÓÃBlockÄܹ»±È½Ï¼ò½à£¬Òò´ËÔÚÇëÇóÄÇÒ»²ãÊÇûÓÐÎÊÌâµÄ£¬Ö»ÊÇÔÚ½»»»Êý¾ÝÖ®ºó£¬»¹ÊÇת±ä³Édelegate±È½ÏºÃ£¬±ÈÈçAFNetworkingÀïÃæ£º

[AFNetworkingAPI callApiWithParam:self.param successed:^(Response *response){
if ([self.delegate respondsToSelector:@selector(successWithResponse:)]) {
[self.delegate successedWithResponse:response];
}
} failed:^(Request *request, NSError *error){
if ([self.delegate respondsToSelector:@selector(failedWithResponse:)]) {
[self failedWithRequest:request error:error];
}
}];

ÕâÑùÔÚÒµÎñ·½Õâ±ß»Øµ÷º¯Êý¾ÍÄܹ»±È½Ïͳһ£¬±ãÓÚά»¤¡£

×ÛÉÏ£¬¶ÔÓÚÒÔʲô·½Ê½½«Êý¾Ý½»¸¶¸øÒµÎñ²ã£¿Õâ¸öÎÊÌâµÄ»Ø´ðÊÇÕâÑù£º

¾¡¿ÉÄÜͨ¹ýDelegateµÄ»Øµ÷·½Ê½½»¸¶Êý¾Ý£¬ÕâÑù¿ÉÒÔ±ÜÃâ²»±ØÒªµÄ¿ç²ã·ÃÎÊ¡£µ±³öÏÖ¿ç²ã·ÃÎʵÄÐèÇóʱ£¨±ÈÈçÐźÅÀàÐÍÇл»£©£¬Í¨¹ýNotificationµÄ·½Ê½½»¸¶Êý¾Ý¡£Õý³£Çé¿öÏÂÓ¦¸ÃÊDZÜÃâʹÓÃBlockµÄ¡£

½»¸¶Ê²Ã´ÑùµÄÊý¾Ý¸øÒµÎñ²ã£¿

ÎÒ¼û¹ý·Ç³£¶àµÄAppµÄÍøÂç²ãÔÚÄõ½JSONÊý¾ÝÖ®ºó£¬»á½«Êý¾Ýת±ä³É¶ÔÓ¦µÄ¶ÔÏóÔ­ÐÍ¡£×¢Ò⣬ÎÒÕâÀïÖ¸µÄ²»ÊÇNSDictionary£¬¶øÊÇÀàËÆItemÕâÑùµÄ¶ÔÏó¡£ÕâÖÖ×ö·¨ÊÇÄܹ»Ìá¸ßºóÐø²Ù×÷´úÂëµÄ¿É¶ÁÐԵġ£ÔڱȽÏÖ±¾õµÄ˼·ÀïÃæ£¬ÊÇÐèÒªÕⲿ·Öת»¯¹ý³ÌµÄ£¬µ«Õⲿ·Öת»¯¹ý³ÌµÄ³É±¾ÊǺܴóµÄ£¬Ö÷Òª³É±¾ÔÚÓÚ£º

Êý×éÄÚÈݵÄת»¯³É±¾½Ï¸ß£ºÊý×éÀïÃæÃ¿ÏҪת»¯³ÉItem¶ÔÏó£¬Èç¹ûItem¶ÔÏóÖл¹ÓÐÀàËÆÊý×飬¾ÍºÜÍ·ÌÛ¡£

ת»¯Ö®ºóµÄÊý¾ÝÔڴ󲿷ÖÇé¿öÊDz»ÄÜÖ±½Ó±»Õ¹Ê¾µÄ£¬ÎªÁËÄܹ»±»Õ¹Ê¾£¬»¹ÐèÒªµÚ¶þ´Îת»¯¡£

Ö»ÓÐÔÚAPI·µ»ØµÄÊý¾Ý¸ß¶È±ê×¼»¯Ê±£¬ÕâЩ¶ÔÏóÔ­ÐÍ£¨Item£©µÄ¿É¸´Óó̶ȲŸߣ¬·ñÔòÈÝÒ׳öÏÖÀàÐͱ¬Õ¨£¬Ìá¸ßά»¤³É±¾¡£

µ÷ÊÔʱͨ¹ý¶ÔÏóÔ­ÐͲ鿴Êý¾ÝÄÚÈݲ»ÈçÖ±½Óͨ¹ýNSDictionary/NSArrayÖ±¹Û¡£

ͬһAPIµÄÊý¾Ý±»²»Í¬Viewչʾʱ£¬ÄÑÒÔ¿ØÖÆÊý¾Ýת»¯µÄ´úÂ룬ËüÃÇÓпÉÄÜ»áÉ¢ÂäÔÚÈκÎÐèÒªµÄµØ·½¡£

ÆäʵÎÒÃǵÄÀíÏëÇé¿öÊÇÏ£ÍûAPIµÄÊý¾ÝÏ·¢Ö®ºó¾ÍÄܹ»Ö±½Ó±»ViewËùչʾ¡£Ê×ÏÈҪ˵µÄÊÇ£¬ÕâÖÖÇé¿ö·Ç³£ÉÙ¡£ÁíÍ⣬ÕâÖÖ×ö·¨Ê¹µÃViewºÍAPIÁªÏµ½ôÃÜ£¬Ò²ÊÇÎÒÃDz»Ï£Íû·¢ÉúµÄ¡£

ÔÚÉè¼Æ°²¾Ó¿ÍµÄÍøÂç²ãÊý¾Ý½»¸¶Õⲿ·Öʱ£¬ÎÒÌí¼ÓÁËreformer£¨Ãû×Ö¶øÒÑ£¬½Ðʲô¶¼ºÃ£©Õâ¸ö¶ÔÏóÓÃÓÚ·â×°Êý¾Ýת»¯µÄÂß¼­£¬Õâ¸ö¶ÔÏóÊÇÒ»¸ö¶ÀÁ¢¶ÔÏó£¬ÊÂʵÉÏ£¬ËüÊÇ×÷ΪAdaptorģʽ´æÔڵġ£ÎÒÃÇ¿ÉÒÔÕâôÀí½â£ºÏëÏóÒ»ÏÂÎÒÃÇÏ´ÔèʱºòʹÓõÄÁ«ÅîÍ·£¬Ë®¹ÜÀï³öÀ´µÄË®ÊÇAPIÏ·¢µÄԭʼÊý¾Ý¡£reformer¾ÍÊÇÁ«ÅîÍ·ÉϵIJ»Í¬Ë®Á÷µ²°å£¬ÐèҪʲôģʽ£¬¾Í²¦µ½Ê²Ã´Ä£Ê½¡£

ÔÚʵ¼ÊʹÓÃʱ£¬´úÂë¹Û¸ÐÊÇÕâÑùµÄ£º

Ïȶ¨ÒåÒ»¸öprotocol£º

@protocol ReformerProtocol <NSObject>
- (NSDictionary)reformDataWithManager:(APIManager *)manager;
@end


ÔÚControllerÀïÊÇÕâÑù£º

@property (nonatomic, strong) id<ReformerProtocol> XXXReformer;
@property (nonatomic, strong) id<ReformerProtocol> YYYReformer;

#pragma mark - APIManagerDelegate
- (void)apiManagerDidSuccess:(APIManager *)manager
{
NSDictionary *reformedXXXData = [manager fetchDataWithReformer:self.XXXReformer];
[self.XXXView configWithData:reformedXXXData];

NSDictionary *reformedYYYData = [manager fetchDataWithReformer:self.YYYReformer];
[self.YYYView configWithData:reformedYYYData];
}


ÔÚAPIManagerÀïÃæ£¬fetchDataWithReformerÊÇÕâÑù£º
- (NSDictionary)fetchDataWithReformer:(id<ReformerProtocol>)reformer
{
if (reformer == nil) {
return self.rawData;
} else {
return [reformer reformDataWithManager:self];
}
}

Òªµã1£ºreformerÊÇÒ»¸ö·ûºÏReformerProtocolµÄ¶ÔÏó£¬ËüÌṩÁËͨÓõķ½·¨¹©ManagerʹÓá£

Òªµã2£ºAPIµÄԭʼÊý¾Ý£¨JSON¶ÔÏó£©ÓÉManagerʵÀý±£¹Ü£¬reformer·½·¨ÀïÃæÈ¡ManagerµÄԭʼÊý¾Ý(manager.rawData)×öת»»£¬È»ºó½»¸¶³öÈ¥¡£Á«ÅîÍ·µÄË®¹Ü²¿·ÖÊÇManager£¬¸ºÔðÌṩԭʼˮÁ÷£¨Êý¾ÝÁ÷£©£¬reformer¾ÍÊDz»Í¬µÄģʽ£¬»»Ê²Ã´reformer¾ÍÄܳöÀ´Ê²Ã´Ë®Á÷¡£

Òªµã3£ºÀý×ÓÖоٵij¡¾°ÊÇÒ»¸öAPIÊý¾Ý±»¶à¸öViewʹÓõÄÇé¿ö£¬ÌåÏÖÁËreformerµÄÒ»¸öÌØµã£º¿ÉÒÔ¸ù¾ÝÐèÒª¸Ä±äͬһÊý¾ÝÀ´Ô´µÄչʾ·½Ê½¡£±ÈÈçAPIÊý¾ÝչʾµÄÊÇ¡°¸½½üµÄÐ¡Çø¡±£¬ÄÇôÕâ¸öÊý¾Ý¿ÉÒÔ±»ÁÐ±í£¨XXXView£©ºÍµØÍ¼£¨YYYView£©¹²Ó㬲»Í¬µÄviewʹÓõÄÊý¾ÝµÄת»¯·½Ê½²»Ò»Ñù£¬Õâ¾Íͨ¹ý²»Í¬µÄreformer½â¾öÁË¡£

Òªµã4£ºÔÚÒ»¸öviewÓÃÀ´Í¬Ò»Õ¹Ê¾²»Í¬APIÊý¾ÝµÄÇé¿ö£¬reformerÊǾø¼ÑÀûÆ÷¡£±ÈÈç°²¾Ó¿ÍµÄÁбíviewµÄÊý¾ÝÀ´Ô´¿ÉÄÜÓÐÈý¸ö£º¶þÊÖ·¿ÁбíAPI£¬×â·¿ÁбíAPI£¬Ð·¿ÁбíAPI¡£ÕâЩAPI·µ»ØÀ´µÄÊý¾ÝµÄvalue¿ÉÄÜÒ»Ö£¬µ«ÊÇkey¶¼ÊDz»Ò»Öµġ£Õâʱºò¾Í¿ÉÒÔͨ¹ýͬһ¸öreformerÀ´×öÊý¾ÝµÄ±ê×¼»¯Êä³ö£¬ÕâÑù¾ÍʹµÃview´úÂ븴ÓóÉΪ¿ÉÄÜ¡£ÕâÌåÏÖÁËreformerÁíÍâÒ»¸öÌØµã£ºÍ¬Ò»¸öreformer³öÀ´µÄÊý¾ÝÊǸ߶ȱê×¼»¯µÄ¡£ÐÎÏóµã˵¾ÍÊÇ£ºÖ»ÒªÁ«ÅîÍ·²»»»£¬ÄÄÅÂË®¹ÜµÄË®±ä³Éº£Ë®»òÕßÎÛË®ÁË£¬Ò²ÒÀ¾ÉÄܹ»Êä³ö·ûºÏÏ´ÔèÒªÇóµÄµ­Ë®Ë®Á÷¡£¾Ù¸öÀý×Ó£º

- (void)apiManagerDidSuccess:(APIManager *)manager
{
// Õâ¸ö»Øµ÷·½·¨ÓпÉÄÜÊÇÀ´×Ô¶þÊÖ·¿ÁбíAPIManagerµÄ»Øµ÷£¬Ò²ÓпÉÄÜÊÇ×â·¿£¬Ò²ÓпÉÄÜÊÇз¿¡£µ«ÊÇÔÚController²ãÃæÎÒÃDz»ÐèÒª¶ÔËü×ö¶îÍâÇø·Ö£¬Ö»ÒªÊÇͬһ¸öreformer³öÀ´µÄÊý¾Ý£¬ÎÒÃǾÍÄܱ£Ö¤ÊÇÒ»¶¨Äܱ»self.XXXViewʹÓõġ£ÕâÑùµÄ±£Ö¤ÓÉreformerµÄʵÏÖÕßÀ´Ìṩ¡£
NSDictionary *reformedXXXData = [manager fetchDataWithReformer:self.XXXReformer];
[self.XXXView configWithData:reformedXXXData];
}

Òªµã5£ºÓÐûÓз¢ÏÖ£¬Ê¹ÓÃreformerÖ®ºó£¬ControllerµÄ´úÂë¼ò½àÁ˺ܶࣿ¶øÇÒ£¬Êý¾ÝÔ­ÐÍÔÚÕâÖÖÇé¿öϾÍûÓбØÒª´æÔÚÁË£¬ËæÖ®¶øÀ´µÄ³É±¾Ò²¾Í±»ÎÒÃÇÈÆ¹ýÁË¡£

reformer±¾ÖÊÉϾÍÊÇÒ»¸ö·ûºÏij¸öprotocolµÄ¶ÔÏó£¬ÔÚcontrollerÐèÒª´Óapi managerÖлñµÃÊý¾ÝµÄʱºò£¬Ë³±ã°Ñreformer´«½øÈ¥£¬ÓÚÊǾÍÄÜ»ñµÃ¾­¹ýreformerÖØÐÂÏ´¹ýµÄÊý¾Ý£¬È»ºó¾Í¿ÉÒÔÖ±½ÓʹÓÃÁË¡£

¸ü³éÏóµØËµ£¬reformerÆäʵÊǶÔÊý¾Ýת»¯Âß¼­µÄÒ»¸ö·â×°¡£ÔÚcontroller´ÓmanagerÖÐÈ¡Êý¾ÝÖ®ºó£¬²¢ÇÒ°ÑÊý¾Ý½»¸øview֮ǰ£¬ÕâÆÚ¼ä»ò¶à»òÉÙ¶¼ÊÇÒª×öÒ»´ÎÊý¾Ýת»¯µÄ£¬ÓеÄʱºò²»Í¬µÄview£¬¶ÔÓ¦µÄת»¯Âß¼­»¹²»Ò»Ñù£¬µ«ÊÇչʾµÄÊý¾ÝÊÇÒ»ÑùµÄ¡£¶øÇÒÍùÍùÕâÒ»²¿·Ö´úÂë¶¼·Ç³£¸´ÔÓ£¬ÇÒ¸úÒµÎñÇ¿Ïà¹Ø£¬Ö±½ÓÉÏ´úÂ룬½«À´¾Í»áºÜÄÑά»¤¡£ËùÒÔÎÒÃÇ¿ÉÒÔ¿¼ÂDzÉÓò»Í¬µÄreformer·â×°²»Í¬µÄת»¯Âß¼­£¬È»ºóÈÃcontroller¸ù¾ÝÐèҪѡÔñÒ»¸öºÏÊʵÄreformer×°ÉÏ£¬¾ÍÏñÏ´ÔèµÄÁ«ÅîÍ·£¬ÐèҪʲôÑùµÄË®Á÷£¨Êý¾ÝµÄ±íÏÖÐÎʽ£©¾Í»»Ê²Ã´ÑùµÄÍ·£¬È»¶øË®£¨Êý¾Ý£©¶¼ÊÇÒ»ÑùµÄ¡£ÕâÖÖ×ö·¨Äܹ»´ó´óÌá¸ß´úÂëµÄ¿Éά»¤ÐÔ£¬ÒÔ¼°¼õÉÙViewControllerµÄÌå»ý¡£

×ܽáһϣ¬reformerÊÂʵÉÏÊǰÑת»¯µÄ´úÂë·â×°Ö®ºóÔÙ´ÓÖ÷ÌåÒµÎñÖвð·ÖÁ˳öÀ´£¬²ð·Ö³öÀ´Ö®ºó²»¹â½µµÍÁËÔ­ÓÐÒµÎñµÄ¸´ÔÓ¶È£¬¸üÖØÒªµÄÊÇ£¬ËüÌá¸ßÁËÊý¾Ý½»¸¶µÄÁé»îÐÔ¡£ÁíÍ⣬ÓÉÓÚController¸ºÔðµ÷¶ÈManagerºÍView£¬Òò´ËËüÊÇÖªµÀManagerºÍViewÖ®¼äµÄ¹ØÏµµÄ£¬ControllerÖªµÀÁËÕâ¸ö¹ØÏµÖ®ºó£¬¾ÍÓÐÁ˳äÒªÌõ¼þÀ´Îª²»Í¬µÄViewÑ¡Ôñ²»Í¬µÄReformer£¬²¢ÓÃÕâ¸öReformerÈ¥¸ÄÔìManangerµÄÊý¾Ý£¬È»ºóViewController»ñµÃÁ˾­¹ýreformer´¦Àí¹ýµÄÊý¾ÝÖ®ºó£¬¾Í¿ÉÒÔÖ±½Ó½»¸¶¸øviewȥʹÓá£ControllerÒò´ËµÃµ½ÊÝÉí£¬¸ºÔðÒµÎñÊý¾Ýת»¯µÄÕⲿ·Ö´úÂëÒ²²»ÓÃдÔÚControllerÀïÃæ£¬Ìá¸ßÁË¿Éά»¤ÐÔ¡£

ËùÒÔreformer»úÖÆÄܹ»´øÀ´ÒÔϺô¦£º

ºÃ´¦1£ºÈÆ¿ªÁËAPIÊý¾ÝÔ­Ð͵Äת»»£¬±ÜÃâÁËÏà¹Ø³É±¾¡£

ºÃ´¦2£ºÔÚ´¦Àíµ¥View¶Ô¶àAPI£¬ÒÔ¼°ÔÚµ¥API¶Ô¶àViewµÄÇé¿öʱ£¬reformerÌṩÁ˷dz£ÓÅÑŵÄÊÖ¶ÎÀ´ÏìÓ¦ÕâÖÖÐèÇ󣬸ôÀëÁËת»¯Âß¼­ºÍÖ÷ÌåÒµÎñÂß¼­£¬±ÜÃâÁËά»¤ÔÖÄÑ¡£

ºÃ´¦3£º×ª»¯Âß¼­¼¯ÖУ¬ÇÒ½«×ª»¯´ÎÊýתΪֻÓÐÒ»´Î¡£Ê¹ÓÃÊý¾ÝÔ­Ð͵Äת»¯Âß¼­ÖÁÉÙÓÐÁ½´Î£¬µÚÒ»´ÎÊǰÑJSONÓ³Éä³É¶ÔÓ¦µÄÔ­ÐÍ£¬µÚ¶þ´ÎÊǰÑÔ­ÐÍת±ä³ÉÄܱ»View´¦ÀíµÄÊý¾Ý¡£reformerÒ»²½µ½Î»¡£ÁíÍ⣬ת»¯Âß¼­ÔÚreformerÀïÃæ£¬½«À´Èç¹ûAPIÊý¾ÝÓб䣬¾ÍֻҪȥÕÒµ½¶ÔÓ¦reformerÈ»ºó¸Äµô¾ÍºÃÁË¡£

ºÃ´¦4£ºControllerÒò´Ë¿ÉÒÔʡȥ·Ç³£¶àµÄ´úÂ룬½µµÍÁË´úÂ븴ÔÓ¶È£¬Í¬Ê±Ìá¸ßÁËÁé»îÐÔ£¬ÈκÎʱºòÇл»reformer¶ø²»±ØÇл»ÒµÎñÂß¼­¾Í¿ÉÒÔÓ¦¶Ô²»Í¬View¶ÔÊý¾ÝµÄÐèÒª¡£

ºÃ´¦5£ºÒµÎñÊý¾ÝºÍÒµÎñÓÐÁËÊʵ±µÄ¸ôÀë¡£Õâô×öµÄ»°£¬½«À´Èç¹ûÒµÎñÂß¼­ÓÐÐ޸쬻»Ò»¸öreformer¾ÍºÃÁË¡£Èç¹ûÆäËûÒµÎñÒ²ÓÐÏàͬµÄÊý¾Ýת»¯Âß¼­£¬ÆäËûÒµÎñÖ±½ÓÄÃÕâ¸öreformer¾Í¿ÉÒÔÓÃÁË£¬²»ÓÃÖØÐ´¡£ÁíÍ⣬Èç¹ûcontrollerÓÐÐ޸썱ÈÈçUI½»»¥·½Ê½¸Ä±ä£©£¬¿ÉÒÔ·ÅÐÄ»»controller£¬ÍêÈ«²»Óõ£ÐÄÒµÎñÊý¾ÝµÄ´¦Àí¡£

ÔÚ²»Ê¹ÓÃÌØ¶¨¶ÔÏó±íÕ÷Êý¾ÝµÄÇé¿öÏ£¬ÈçºÎ±£³ÖÊý¾Ý¿É¶ÁÐÔ£¿

²»Ê¹ÓöÔÏóÀ´±íÕ÷Êý¾ÝµÄʱºò£¬ÊÂʵÉϾÍÊÇʹÓÃNSDictionaryµÄʱºò¡£ÊÂʵÉÏ£¬Õâ¸öÎÊÌâ¾ÍÊÇ£¬ÈçºÎÔÚNSDictionary±íÕ÷Êý¾ÝµÄÇé¿öϱ£³ÖÁ¼ºÃµÄ¿É¶ÁÐÔ£¿

Æ»¹ûÒѾ­¸ø³öÁ˷dz£ºÃµÄ×ö·¨£¬Óù̶¨×Ö·û´®×ökey£¬±ÈÈçÄãÔÚ½ÓÊÕµ½KeyBoardWillShowµÄNotificationʱ£¬´øÁËÒ»¸öuserInfo£¬ËûµÄkey¾Í¶¼ÊÇÀàËÆUIKeyboardAnimationCurveUserInfoKeyÕâÑùµÄ£¬ËùÒÔÎÒÃDzÉÓÃÕâÑùµÄ·½°¸À´Î¬³Ö¿É¶ÁÐÔ¡£ÏÂÃæÎÒ¾ÙÒ»¸öÀý×Ó£º

PropertyListReformerKeys.h

extern NSString * const kPropertyListDataKeyID;
extern NSString * const kPropertyListDataKeyName;
extern NSString * const kPropertyListDataKeyTitle;
extern NSString * const kPropertyListDataKeyImage;

 

PropertyListReformer.h

#import "PropertyListReformerKeys.h"

... ...

 

PropertyListReformer.m

NSString * const kPropertyListDataKeyID = @"kPropertyListDataKeyID";
NSString * const kPropertyListDataKeyName = @"kPropertyListDataKeyName";
NSString * const kPropertyListDataKeyTitle = @"kPropertyListDataKeyTitle";
NSString * const kPropertyListDataKeyImage = @"kPropertyListDataKeyImage";

- (NSDictionary *)reformData:(NSDictionary *)originData fromManager:(APIManager *)manager
{
... ...
... ...

NSDictionary *resultData = nil;

if ([manager isKindOfClass:[ZuFangListAPIManager class]]) {
resultData = @{
kPropertyListDataKeyID:originData[@"id"],
kPropertyListDataKeyName:originData[@"name"],
kPropertyListDataKeyTitle:originData[@"title"],
kPropertyListDataKeyImage:[UIImage imageWithUrlString:originData[@"imageUrl"]]
};
}

if ([manager isKindOfClass:[XinFangListAPIManager class]]) {
resultData = @{
kPropertyListDataKeyID: originData [@"xinfang_id"],
kPropertyListDataKeyName: originData [@"xinfang_name"],
kPropertyListDataKeyTitle: originData [@"xinfang_title"],
kPropertyListDataKeyImage: [UIImage imageWithUrlString:originData [@"xinfang_imageUrl"]]
};
}

if ([manager isKindOfClass: [ErShouFangListAPIManager class]]) {
resultData = @{
kPropertyListDataKeyID: originData [@"esf_id"],
kPropertyListDataKeyName: originData [@"esf_name"],
kPropertyListDataKeyTitle: originDat a[@"esf_title"],
kPropertyListDataKeyImage: [UIImage imageWithUrlString:originData [@"esf_imageUrl"]]
};
}

return resultData;
}

 

PropertListCell.m

#import "PropertyListReformerKeys.h"

- (void)configWithData:(NSDictionary *)data
{
self.imageView.image = data[kPropertyListDataKeyImage];
self.idLabel.text = data[kPropertyListDataKeyID];
self.nameLabel.text = data[kPropertyListDataKeyName];
self.titleLabel.text = data[kPropertyListDataKeyTitle];
}

ÕâÒ»´ó¶Î´úÂë¿´ÏÂÀ´£¬ÎÒÈç¹û²»ËµÒ»ÏÂÒªµã£¬ÄÇ»ù±¾ÉϾͰ×дÁ˹þ£º

ÎÒÃÇÏÈ¿´Ò»Ï½ṹ£º

ʹÓÃConst×Ö·û´®À´±íÕ÷Key£¬×Ö·û´®µÄ¶¨Òå¸ú×ÅreformerµÄʵÏÖÎļþ×ߣ¬×Ö·û´®µÄexternÉùÃ÷·ÅÔÚ¶ÀÁ¢µÄÍ·ÎļþÄÚ¡£

ÕâÑùreformerÉú³ÉµÄÊý¾ÝµÄkey¶¼Ê¹ÓÃConst×Ö·û´®À´±íʾ£¬È»ºóÿ´Î±ðµÄµØ·½ÐèҪʹÓÃÏà¹ØÊý¾ÝµÄʱºò£¬°ÑPropertyListReformerKeys.hÕâ¸öÍ·Îļþimport½øÈ¥¾ÍºÃÁË¡£

ÁíÍâҪעÒâµÄÒ»µãÊÇ£¬Èç¹ûÒ»¸öOriginData¿ÉÄܻᱻ¶à¸öReformerÈ¥´¦ÀíµÄ»°£¬KeyµÄÃüÃû¹æ·¶ÐèÒªÄܹ»±íÕ÷³öÆä¶ÔÓ¦µÄreformerÃû×Ö¡£Èç¹ûreformerÊÇPropertyListReformer£¬ÄÇôKeyµÄÃû×Ö¾ÍÊÇPropertyListKeyXXXX¡£

Õâô×öµÄºÃ´¦¾ÍÊÇ£¬½«À´Ç¨ÒƵÄʱºòÏ൱·½±ã£¬Ö»ÒªÈÓÍ·Îļþ¾Í¿ÉÒÔÁË£¬Ö»ÈÓÍ·ÎļþÊDz»»áµ¼Ö°γöÂܲ·´ø³öÄàµÄÇé¿öµÄ¡£¶øÇÒÒ²±ÜÃâÁË×Ô¶¨Òå¶ÔÏó´øÀ´µÄ¶îÍâ´úÂëÌå»ý¡£

ÁíÍ⣬¹ØÓÚ½»¸¶µÄNSDictionary£¬Æäʵ¾ßÌ廹ÊÇ¿´viewµÄÐèÇó£¬reformerµÄÉè¼Æ³õÖÔÊÇ£ºÍ¨¹ýreformerת»¯³öÀ´µÄ¿ÉÒÔÖ±½ÓÊÇView£¬»òÕßÊÇviewÖ±½Ó¿ÉÒÔʹÓõĶÔÏ󣨰üÀ¨NSDictionary£©¡£±ÈÈçµØÍ¼±êµãÁбíAPIµÄÊý¾Ý£¬Í¨¹ýreformerת»¯Ö®ºó¾Í¿ÉÒÔÖ±½Ó±ä³ÉMKAnnotation£¬È»ºóMKMapView¾Í¿ÉÒÔÖ±½ÓʹÓÃÁË¡£ÕâÀï˵µÄÖ»Êǵ±ÄãµÄÐèÇóÊǽ»¸¶NSDictionaryʱ£¬ÈçºÎ±£Ö¤¿É¶ÁÐÔµÄÇé¿ö£¬ÔÙÇ¿µ÷һϹþ£¬reformer½»¸¶µÄÊÇviewÖ±½Ó¿ÉÒÔʹÓõĶÔÏ󣬽»¸¶³öÈ¥µÄ¿ÉÒÔÊÇNSDictionary£¬Ò²¿ÉÒÔÊÇUIView£¬¸úDataSource½áºÏÖ®ºó½»¸¶µÄÉõÖÁ¿ÉÒÔÊÇUITableViewCell/UICollectionViewCell¡£²»Òª±»NSDictionary»òËùνµÄת»¯³ÉmodelÔÙ½»¸¶µÄ˼Ïë¾ÖÏÞ¡£

×ÛÉÏ£¬ÎÒ¶Ô½»¸¶Ê²Ã´ÑùµÄÊý¾Ý¸øÒµÎñ²ã£¿Õâ¸öÎÊÌâµÄ»Ø´ð¾ÍÊÇÕâÑù£º

¶ÔÓÚÒµÎñ²ã¶øÑÔ£¬ÓÉController¸ù¾ÝViewºÍAPIManagerÖ®¼äµÄ¹ØÏµ£¬Ñ¡ÔñºÏÊʵÄreformer½«View¿ÉÒÔÖ±½ÓʹÓõÄÊý¾Ý£¨ÉõÖÁreformer¿ÉÒÔÓÃÀ´Ö±½ÓÉú³Éview£©×ª»¯ºÃÖ®ºó½»¸¶¸øView¡£¶ÔÓÚÍøÂç²ã¶øÑÔ£¬Ö»ÐèÒª±£³ÖסԭʼÊý¾Ý¼´¿É£¬²»ÐèÒªÖ÷¶¯×ª»¯³ÉÊý¾ÝÔ­ÐÍ¡£È»ºóÊý¾Ý²ÉÓÃNSDictionary¼ÓConst×Ö·û´®keyÀ´±íÕ÷£¬±ÜÃâÁËʹÓöÔÏóÀ´±íÕ÷´øÀ´µÄÇ¨ÒÆÀ§ÄÑ£¬Í¬Ê±²»Ê§È¥¿É¶ÁÐÔ¡£

¼¯Ô¼ÐÍAPIµ÷Ó÷½Ê½ºÍÀëÉ¢ÐÍAPIµ÷Ó÷½Ê½µÄÑ¡Ôñ£¿

¼¯Ô¼ÐÍAPIµ÷ÓÃÆäʵ¾ÍÊÇËùÓÐAPIµÄµ÷ÓÃÖ»ÓÐÒ»¸öÀ࣬ȻºóÕâ¸öÀà½ÓÊÕAPIÃû×Ö£¬API²ÎÊý£¬ÒÔ¼°»Øµ÷׎µã£¨¿ÉÒÔÊÇtarget-action£¬»òÕßblock£¬»òÕßdelegateµÈ¸÷ÖÖģʽµÄ׎µã£©×÷Ϊ²ÎÊý¡£È»ºóÖ´ÐÐÀàËÆstartRequestÕâÑùµÄ·½·¨£¬Ëü¾Í»áÈ¥¸ù¾ÝÕâЩ²ÎÊýÆð·ÉÈ¥µ÷ÓÃAPIÁË£¬È»ºó»ñµÃAPIÊý¾ÝÖ®ºóÔÙ¸ù¾ÝÖ¸¶¨µÄ׎µãȥ׎¡£±ÈÈçÕâÑù£º

¼¯Ô¼ÐÍAPIµ÷Ó÷½Ê½£º

[APIRequest startRequestWithApiName:@"itemList.v1" params:params success:@selector(success:) fail:@selector(fail:) target:self];

ÀëÉ¢ÐÍAPIµ÷ÓÃÊÇÕâÑùµÄ£¬Ò»¸öAPI¶ÔÓ¦ÓÚÒ»¸öAPIManager£¬È»ºóÕâ¸öAPIManagerÖ»ÐèÒªÌṩ²ÎÊý¾ÍÄÜÆð·É£¬APIÃû×Ö¡¢×Ž·½Ê½¶¼ÒѾ­¼¯³ÉÈëAPIManagerÖС£±ÈÈçÕâÑù£º

ÀëÉ¢ÐÍAPIµ÷Ó÷½Ê½£º

@property (nonatomic, strong) ItemListAPIManager *itemListAPIManager;

// getter
- (ItemListAPIManager *)itemListAPIManager
{
if (_itemListAPIManager == nil) {
_itemListAPIManager = [[ItemListAPIManager alloc] init];
_itemListAPIManager.delegate = self;
}

return _itemListAPIManager;
}

// ʹÓõÄʱºò¾ÍÕâôд£º
[self.itemListAPIManager loadDataWithParams:params];

¼¯Ô¼ÐÍAPIµ÷ÓúÍÀëÉ¢ÐÍAPIµ÷ÓÃÕâÁ½ÕßʵÏÖ·½°¸²»ÊÇ»¥³âµÄ£¬µ¥¿´Ï²㣬´ó¼Ò¶¼ÊǼ¯Ô¼ÐÍ¡£ÒòΪ·¢ÆðÒ»¸öAPIÇëÇóÖ®ºó£¬³ýÈ¥ÒµÎñÏà¹ØµÄ²¿·Ö£¨±ÈÈç²ÎÊýºÍAPIÃû×ֵȣ©£¬Ê£ÏµĶ¼ÊÇҪͳһ´¦ÀíµÄ£º¼ÓÃÜ£¬URLÆ´½Ó£¬APIÇëÇóµÄÆð·ÉºÍ׎£¬ÕâЩ´¦ÀíÈç¹û²»Óü¯Ô¼»¯µÄ·½Ê½À´ÊµÏÖ£¬×÷Õß·Çñ²¼´³Õ¡£È»¶ø¶ÔÓÚÕû¸öÍøÂç²ãÀ´Ëµ£¬ÓÈÆäÊÇÒµÎñ·½Ê¹ÓõÄÄDz¿·Ö£¬ÎÒÇãÏòÓÚÌṩÀëÉ¢Ð͵ÄAPIµ÷Ó÷½Ê½£¬²¢²»½¨ÒéÔÚÒµÎñ²ãµÄ´úÂëÖ±½ÓʹÓü¯Ô¼Ð͵ÄAPIµ÷Ó÷½Ê½¡£Ô­ÒòÈçÏ£º

Ô­Òò1£ºµ±Ç°ÇëÇóÕýÔÚÍâÃæ·É×ŵÄʱºò£¬¸ù¾Ý²»Í¬µÄÒµÎñÐèÇó´æÔÚÁ½ÖÖ²»Í¬µÄÇëÇóÆð·É²ßÂÔ£ºÒ»¸öÊÇÈ¡Ïûз¢ÆðµÄÇëÇ󣬵ȴýÍâÃæ·É×ŵÄÇëÇó׎¡£ÁíÒ»¸öÊÇÈ¡ÏûÍâÃæ·É×ŵÄÇëÇó£¬ÈÃз¢ÆðµÄÇëÇóÆð·É¡£¼¯Ô¼»¯µÄAPIµ÷Ó÷½Ê½Èç¹ûÒªÂú×ãÕâÑùµÄÐèÇó£¬ÄÇôÿ´ÎÒªµ÷ÓõÄʱºò¶¼Òª¶àдһ²¿·ÖÅжϺÍÈ¡ÏûµÄ´úÂ룬ÊֶξÍ×ö²»µ½ºÜ¸É¾»¡£

ǰÕßµÄÒµÎñ³¡¾°¾Ù¸öÀý×Ó¾ÍÊÇË¢ÐÂÒ³ÃæµÄÇëÇó£¬Ë¢ÐÂÏêÇ飬ˢÐÂÁбíµÈ¡£ºóÕßµÄÒµÎñ³¡¾°¾Ù¸öÀý×ÓÊÇÁбí¶àά¶Èɸѡ£¬±ÈÈçÄãÏÈɸѡÁËÉÌÆ·ÀàÐÍ£¬È»ºóɸѡÁ˼۸ñÇø¼ä¡£µ±È»£¬ºóÕßµÄÇé¿ö²»Ò»¶¨Ã¿´Îɸѡ¶¼Òªµ÷ÓÃAPI£¬ÎÒÃÇÏȼÙÉèÕâÖÖɸѡÿ´Î¶¼±ØÐëҪͨ¹ýµ÷ÓÃAPI²ÅÄÜ»ñµÃÊý¾Ý¡£

Èç¹ûÊÇÀëÉ¢Ð͵ÄAPIµ÷Óã¬ÔÚ±àд²»Í¬µÄAPIManagerʱºò¾Í¿ÉÒÔÕë¶Ô²»Í¬µÄAPIÉèÖò»Í¬µÄÆð·É²ßÂÔ£¬ÔÚʵ¼ÊʹÓõÄʱºò£¬¾Í¿ÉÒÔ²»±Ø¹ØÐÄÆð·É²ßÂÔÁË£¬ÒòΪAPIManangerÀïÃæÒѾ­Ð´ºÃÁË¡£

Ô­Òò2£º±ãÓÚÕë¶Ôij¸öAPIÇëÇóÀ´½øÐÐAOP¡£ÔÚ¼¯Ô¼Ð͵ÄAPIµ÷Ó÷½Ê½Ï£¬Èç¹ûÒªÕë¶Ôij¸öAPIÇëÇóµÄÆð·ÉºÍ׎¹ý³Ì½øÐÐAOP£¬Õâ´úÂëµÃд³ÉʲôÑù¡£¡£¡£àÞ£¬ÄáÂêÕâ»­ÃæÌ«ÃÀ±ð˵¿´ÁË£¬ÎÒ¶¼²»¸ÒÏë¡£

Ô­Òò3£ºµ±APIÇëÇóµÄ׎µãÏûʧʱ£¬ÀëÉ¢Ð͵ÄAPIµ÷Ó÷½Ê½Äܹ»¸ü¼Ó͸Ã÷µØ´¦ÀíÕâÖÖÇé¿ö¡£

µ±Ò»¸öÒ³ÃæµÄÇëÇóÕýÔÚÌìÉϷɵÄʱºò£¬Óû§µÈÁ˺þò»ÄÍ·³ÁË£¬Ð¡ÊÖµãÁ˸öback£¬È»ºóViewController±»pop±»»ØÊÕ¡£´ËʱÇëÇóµÄ׎µã¾ÍûÁË¡£ÕâÊǺÜΣÏÕµÄÇé¿ö£¬×޵ãÒªÊÇûÁË£¬¾ÍºÜÈÝÒ×crashµÄ¡£Ò»°ãÀ´Ëµ´¦ÀíÕâ¸öÇé¿ö¶¼ÊÇÔÚdeallocµÄʱºòÈ¡Ïûµ±Ç°Ò³ÃæËùÓеÄÇëÇó¡£Èç¹ûÊǼ¯Ô¼Ð͵ÄAPIµ÷Óã¬Õâ¸ö´úÂë¾ÍҪдµ½ViewControllerµÄdeallocÀïÃæ£¬µ«Èç¹ûÊÇÀëÉ¢Ð͵ÄAPIµ÷Óã¬Õâ¸ö´úÂëдµ½APIManagerÀïÃæ¾Í¿ÉÒÔÁË£¬È»ºóËæ×ÅViewControllerµÄ»ØÊÕ½ø³Ì£¬APIManagerÒ²»á±»¸ú×Å»ØÊÕ£¬Õⲿ·Ö´úÂë¾ÍµÃµ½Á˵÷ÓõĻú»á¡£ÕâÑùÒµÎñ·½ÔÚʹÓõÄʱºò¾Í¿ÉÒÔ²»±Ø¹ØÐÄ׎µãÏûʧµÄÇé¿öÁË£¬´Ó¶ø¸ü¼Ó¹Ø×¢ÒµÎñ¡£

Ô­Òò4£ºÀëÉ¢Ð͵ÄAPIµ÷Ó÷½Ê½Äܹ»×î´ó³Ì¶ÈµØ¸øÒµÎñ·½ÌṩÁé»îÐÔ£¬±ÈÈçreformer»úÖÆ¾ÍÊÇ»ùÓÚÀëÉ¢Ð͵ÄAPIµ÷Ó÷½Ê½µÄ¡£ÁíÍ⣬Èç¹ûÊÇÕë¶ÔÌṩ·­Ò³»úÖÆµÄAPI£¬APIManager¾ÍÄܼòµ¥µØÌṩloadNextPage·½·¨È¥¼ÓÔØÏÂÒ»Ò³£¬Ò³ÂëµÄ¹ÜÀí¾Í²»ÓÃÒµÎñ·½È¥¹ÜÀíÁË¡£»¹ÓоÍÊÇ£¬Èç¹ûÒªÕë¶ÔÒµÎñÇëÇó²ÎÊý½øÐÐÑéÖ¤£¬±ÈÈçÓû§Ìîдע²áÐÅÏ¢£¬ÔÚÀëÉ¢Ð͵ÄAPIManagerÀïÃæÊµÏ־ͻá·Ç³£ÇáËÉ¡£

×ÛÉÏ£¬¹ØÓÚ¼¯Ô¼Ð͵ÄAPIµ÷ÓúÍÀëÉ¢Ð͵ÄAPIµ÷Óã¬ÎÒÇãÏòÓÚÕâÑù£º¶ÔÍâÌṩһ¸öBaseAPIManagerÀ´¸øÒµÎñ·½×öÅÉÉú£¬ÔÚBaseManagerÀïÃæ²ÉÓü¯Ô¼»¯µÄÊÖ¶Î×é×°ÇëÇ󣬷ŷÉÇëÇó£¬È»¶øÒµÎñ·½µ÷ÓÃAPIµÄʱºò£¬ÔòÊÇÒÔÀëÉ¢µÄAPIµ÷Ó÷½Ê½À´µ÷Óá£Èç¹ûÄãµÄAppÖ»ÌṩÁ˼¯Ô¼»¯µÄ·½Ê½£¬¶øÃ»ÓÐÀëÉ¢·½Ê½µÄͨµÀ£¬ÄÇôÎÒ½¨ÒéÄãÔÙ·â×°Ò»²ã£¬±ãÓÚÒµÎñ·½Ê¹ÓÃÀëÉ¢µÄAPIµ÷Ó÷½Ê½À´·Å·ÉÇëÇó¡£

Ôõô×öAPIManagerµÄ¼Ì³Ð£¿

Èç¹ûÒª×ö³ÉÀëÉ¢Ð͵ÄAPIµ÷Óã¬ÄÇôʹÓü̳ÐÊÇÌÓ²»µôµÄ¡£BaseAPIManagerÀïÃæ¸ºÔð¼¯Ô¼»¯µÄ²¿·Ö£¬ÍⲿÅÉÉúµÄXXXAPIManager¸ºÔðÀëÉ¢µÄ²¿·Ö£¬¶ÔÓÚBaseAPIManagerÀ´Ëµ£¬ÀëÉ¢µÄ²¿·ÖÓÐһЩÊDZØÒªµÄ£¬±ÈÈçAPIÃû×ֵȣ¬¶øÎÒÃÇÅÉÉúµÄÄ¿µÄ£¬Ò²ÊÇΪÁËÌṩÕâЩÊý¾Ý¡£

ÎÒÔÚÕâÆªÎÄÕÂÀïÃæÁоÙÁËÖÖÖּ̳еϵ´¦£¬ºôÓõ´ó¼Ò¾¡Á¿²»ÒªÊ¹Óü̳С£µ«ÊÇÏÖÔÚµ½Á˲»µÃ²»Óü̳еÄʱºò£¬ËùÒÔÎÒµÃÌáÐÑһϴó¼Ò±ð°Ñ¼Ì³ÐÓûµÁË¡£

ÔÚAPIManagerµÄÇé¿öÏ£¬ÎÒÃÇ×îÖ±¾õµÄ˼·ÊÇBaseAPIManagerÌṩһЩ¿Õ·½·¨À´¸ø×ÓÀà×öÖØÔØ£¬±ÈÈçapiMethodNameÕâÑùµÄº¯Êý£¬È»¶øÎҵĽ¨ÒéÊÇ£¬²»ÒªÕâô×ö¡£ÎÒÃÇ¿ÉÒÔÓÃIOPµÄ·½Ê½À´ÏÞÖÆÅÉÉúÀàµÄÖØÔØ¡£

´ó¸Å¾ÍÊdz¤ÕâÑù£º

BaseAPIManagerµÄinit·½·¨ÀïÕâôд£º

// ×¢ÒâÊÇweak¡£
@property (nonatomic, weak) id<APIManager> child;

- (instancetype)init
{
self = [super init];
if ([self conformsToProtocol:@protocol(APIManager)]) {
self.child = (id<APIManager>)self;
} else {
// ²»×ñÊØÕâ¸öprotocolµÄ¾ÍÈÃËûcrash£¬·ÀÖ¹ÅÉÉúÀàÂÒÀ´¡£
NSAssert(NO, "×ÓÀà±ØÐëҪʵÏÖAPIManagerÕâ¸öprotocol¡£");
}
return self;
}

protocolÕâôд£¬°ÑÔ­±¾ÒªÖØÔصĺ¯Êý¶¼¶¨ÒåÔÚÕâ¸öprotocolÀïÃæ£¬¾Í²»ÓÃÔÚ¸¸ÀàÀïÃæÐ´¿Õ·½·¨ÁË£º
@protocol APIManager <NSObject>

@required
- (NSString *)apiMethodName;
...

@end

È»ºóÔÚ¸¸ÀàÀïÃæÈç¹ûҪʹÓõϰ£¬¾ÍÕâôд£º

[self requestWithAPIName:[self.child apiMethodName] ......];

¼òµ¥Ëµ¾ÍÊÇÔÚinitµÄʱºò¼ì²é×Ô¼ºÊÇ·ñ·ûºÏÔ¤ÏÈÉè¼ÆµÄ×ÓÀàµÄprotocol£¬Õâ¾ÍÒªÇóËùÓÐ×ÓÀà±ØÐë×ñÊØÕâ¸öprotocol£¬ËùÓÐÕë¶Ô¸¸ÀàµÄÖØÔØ¡¢¸²¸ÇÒ²¶¼ÒÔÕâ¸öprotocolΪ׼£¬protocolÒÔÍâµÄ·½·¨²»ÔÊÐíÖØÔØ¡¢¸²¸Ç¡£¶øÔÚ¸¸ÀàµÄ´úÂëÀ¿ÉÒÔ²»±Ø×ñÊØÕâ¸öprotocol£¬±£³ÖÁËδÀ´Î¬»¤µÄÁé»îÐÔ¡£

Õâô×öµÄºÃ´¦¾ÍÊDZÜÃâÁ˸¸Ààд¿Õ·½·¨£¬Í¬Ê±Ò²¸ø×ÓÀà´øÉÏÁ˽ô¹¿Ö䣺ҪÏëµ±Îҵĺ¢×Ó£¬¾ÍÒª×ñÊØÕâЩ¹æ¾Ø£¬²»ÄÜÂÒÀ´¡£ÒµÎñ·½ÔÚʵÏÖ×ÓÀàµÄʱºò£¬¾Í¿ÉÒÔ¸ù¾ÝprotocolÖеķ½·¨È¥Ò»Ò»ÊµÏÖ£¬È»ºóÔ¼¶¨¾Í±È½ÏºÃ×öÁË£º²»ÔÊÐíÖØÔØ¸¸Àà·½·¨£¬Ö»ÔÊÐíÑ¡ÔñʵÏÖ»ò²»ÊµÏÖprotocolÖеķ½·¨¡£

¹ØÓÚÕâ¸öµÄ¾ßÌåµÄÂÛÊöÔÚÕâÆªÎÄÕÂÀïÃæÓУ¬¸ÐÐËȤµÄ»°¿ÉÒÔ¿´¿´¡£

ÍøÂç²ãÓëÒµÎñ²ã¶Ô½Ó²¿·ÖµÄС×ܽá

ÕâÒ»½ÚÖ÷ÒªÊǽ²ÁËÒÔÏÂÕâЩµã£º

ʹÓÃdelegateÀ´×öÊý¾Ý¶Ô½Ó£¬½öÔÚ±ØÒªÊ±²ÉÓÃNotificationÀ´×ö¿ç²ã·ÃÎÊ

½»¸¶NSDictionary¸øÒµÎñ²ã£¬Ê¹ÓÃConst×Ö·û´®×÷ΪKeyÀ´±£³Ö¿É¶ÁÐÔ

Ìṩreformer»úÖÆÀ´´¦ÀíÍøÂç²ã·´À¡µÄÊý¾Ý£¬Õâ¸ö»úÖÆºÜÖØÒª£¬ºÃ´¦¼«¶à

ÍøÂç²ãÉϲ¿·ÖʹÓÃÀëÉ¢ÐÍÉè¼Æ£¬Ï²¿·ÖʹÓü¯Ô¼ÐÍÉè¼Æ

Éè¼ÆºÏÀíµÄ¼Ì³Ð»úÖÆ£¬ÈÃÅÉÉú³öÀ´µÄAPIManagerÊܵ½ÏÞÖÆ£¬±ÜÃâ»ìÂÒ

Ó¦¸Ã²»Ö¹Õâ5µã...

ÍøÂç²ãµÄ°²È«»úÖÆ

ÅжÏAPIµÄµ÷ÓÃÇëÇóÊÇÀ´×ÔÓÚ¾­¹ýÊÚȨµÄAPP

ʹÓÃÕâ¸ö»úÖÆµÄÄ¿µÄÖ÷ÒªÓÐÁ½µã£º

È·±£APIµÄµ÷ÓÃÕßÊÇÀ´×ÔÄã×Ô¼ºµÄAPP£¬·ÀÖ¹¾ºÕù¶ÔÊÖÅÀÄãµÄAPI

Èç¹ûÄã¶ÔÍâÌṩÁËÐèҪע²á²ÅÄÜʹÓõÄAPIƽ̨£¬ÄÇôÄãÐèÒªÓÐÕâ¸ö»úÖÆÀ´Ê¶±ðÊÇ·ñÊÇ×¢²áÓû§µ÷ÓÃÁËÄãµÄAPI

½â¾ö·½°¸£ºÉè¼ÆÇ©Ãû

Òª´ïµ½µÚÒ»¸öÄ¿µÄÆäʵºÜ¼òµ¥£¬·þÎñ¶ËÐèÒª¸øÄãÒ»¸öÃÜÔ¿£¬Ã¿´Îµ÷ÓÃAPIʱ£¬ÄãʹÓÃÕâ¸öÃÜÔ¿ÔÙ¼ÓÉÏAPIÃû×ÖºÍAPIÇëÇó²ÎÊýËãÒ»¸öhash³öÀ´£¬È»ºóÇëÇóµÄʱºò´øÉÏÕâ¸öhash¡£·þÎñ¶ËÊÕµ½ÇëÇóÖ®ºó£¬°´ÕÕͬÑùµÄÃÜԿͬÑùµÄËã·¨Ò²ËãÒ»¸öhash³öÀ´£¬È»ºó¸úÇëÇó´øÀ´µÄhash×öÒ»¸ö±È½Ï£¬Èç¹ûÒ»Ö£¬ÄÇô¾Í±íʾÕâ¸öAPIµÄµ÷ÓÃÕßȷʵÊÇÄãµÄAPP¡£ÎªÁ˲»ÈñðÈËÒ²»ñÈ¡µ½Õâ¸öÃÜÔ¿£¬Äã×îºÃ²»Òª°ÑÕâ¸öÃÜÔ¿´æ´¢ÔÚ±¾µØ£¬Ö±½ÓдËÀÔÚ´úÂëÀïÃæ¾ÍºÃÁË¡£ÁíÍâÊʵ±Ôö¼ÓÒ»ÏÂÇóHashµÄËã·¨µÄ¸´ÔÓ¶È£¬ÄǾÍÊǸ÷ÖÖHashËã·¨£¨±ÈÈçMD5£©¼ÓµãÑΣ¬ÔÙ»ØÂ¯ÅÜÒ»´ÎHashɶµÄ¡£ÕâÑù¾ÍÄܽâ¾öµÚÒ»¸öÄ¿µÄÁË£ºÈ·±£ÄãµÄAPIÊÇÀ´×ÔÓÚÄã×Ô¼ºµÄApp¡£

Ò»°ãÇé¿öÏ´󲿷ֹ«Ë¾²»»á³öÏÖÐèÒªÂú×ãµÚ¶þÖÖÇé¿öµÄÐèÇ󣬳ý·Ç¹«Ë¾¿ª·¢ÁË×Ô¼ºµÄAPIƽ̨¸øµÚÈý·½Ê¹Óá£Õâ¸öÐèÇó¸úÉÏÃæµÄÐèÇóÓÐÒ»µã²»Í¬£º·ûºÏÊÚȨµÄAPIÇëÇóÕß²»Ö»ÊÇÒ»¸ö¡£ËùÒÔÔÚÕâÖÖÇé¿öÏ£¬ÐèÒªµÄ°²È«»úÖÆ»á¸ü¼Ó¸´ÔÓÒ»µã¡£

ÕâÀïÓÐÒ»¸ö½ÏÈÝÒ×ʵÏֵķ½°¸£º¿Í»§¶Ëµ÷ÓÃAPIµÄʱºò£¬°Ñ×Ô¼ºµÄÃÜԿͨ¹ýÒ»¸ö¿ÉÄæµÄ¼ÓÃÜËã·¨¼ÓÃܺóÁ¬×ÅÇëÇóºÍ¼ÓÃÜÖ®ºóµÄHashÒ»ÆðËÍÉÏÈ¥¡£µ±È»£¬Õâ¸ö¿ÉÄæµÄ¼ÓÃÜËã·¨¿Ï¶¨ÊÇ·ÅÔÚÔÚµ÷ÓÃAPIµÄSDKÀïÃæ£¬±àÒëºÃµÄ¡£È»ºó·þÎñ¶ËÄõ½¼ÓÃܺóµÄÃÜÔ¿ºÍ¼ÓÃܵÄHashÖ®ºó£¬½âÂëµÃµ½Ô­Ê¼ÃÜÔ¿£¬È»ºóÔÙÓÃËüÈ¥ËãHash£¬×îºóÔÙ½øÐбȶԡ£

±£Ö¤´«ÊäÊý¾ÝµÄ°²È«

ʹÓÃÕâ¸ö»úÖÆµÄÖ÷ҪĿµÄÓÐÁ½µã£º

·ÀÖ¹ÖмäÈ˹¥»÷£¬±ÈÈç˵ÔËÓªÉ̺Üϲ»¶ÍùÓû§µÄHttpÇëÇóÀïÃæÈû¹ã¸æ...

SPDYÒÀÀµÓÚHTTPS£¬¶øÇÒÊÇδÀ´HTTP/2µÄ»ù´¡£¬ËûÃÇÄܹ»Ìá¸ßÄãAPPÔÚÍøÂç²ãÕûÌåµÄÐÔÄÜ¡£

½â¾ö·½°¸£ºHTTPS

ĿǰʹÓÃHTTPSµÄÖ÷ҪĿµÄÔÚÓÚ·ÀÖ¹ÔËÓªÉÌÍùÄãµÄResponse DataÀïÃæ¼Ó¹ã¸æÉ¶µÄ£¨ÖмäÈ˹¥»÷£©£¬Ãæ¶ÔµÄÍþв·¶Î§¸ü¹ã¡£´Ó2011Ä꿪ʼ£¬¹úÍâÒµ½ç¾ÍÒѾ­ÌᳫËùÓеÄÇëÇ󣨲»¹âÊÇAPI£¬»¹ÓÐÍøÕ¾£©¶¼×ßHTTPS£¬¹úÄڲ¶àÍíÁËÁ½Ä꣨2013Äê×óÓÒ£©²Å¿ªÊ¼ÌᳫÕâÊ£¬ÌìèÊÇÕâÁ½¸öÔ²ſªÊ¼×öHTTPSµÄÈ«APPÇ¨ÒÆ¡£

¹ØÓÚËÙ¶È£¬HTTPS¿Ï¶¨ÊDZÈHTTPÂýµÄ£¬±Ï¾¹¶àÁËÒ»´ÎÎÕÊÖ£¬µ«¹ÒÉÏSPDYÖ®ºó£¬ÓÐÁËÁ´½Ó¸´Óã¬Õâ·½ÃæµÄÐÔÄܾÍÓÐÁ˽ϴóÌáÉý¡£ÕâÀïµÄÐÔÄÜÌáÉý²¢²»ÊÇ˵һ¸öÇëÇóÔ­À´Òª500msÄÜÍê³É£¬È»ºóÏÖÔÚÖ»Òª300ms£¬ÕâÊDz»¶ÔµÄ¡£ËùνÕûÌåÐÔÄÜÊÇ»ùÓÚ´óÁ¿ÇëÇóÈ¥ÌÖÂ۵ģºÍ¬ÑùµÄÇëÇóÁ¿£¨¼ÙÉè100¸ö£©ÔÚ¶ÌÆÚ·¢Éúʱ£¬¹ÒÉÏSPDYÖ®ºóÍê³ÉÕâЩÈÎÎñËùÒª»¨µÄʱ¼ä±È²»ÓÃSPDYÒªÉÙ¡£SPDY»¹ÓÐHeaderѹËõµÄ¹¦ÄÜ£¬²»¹ýÒòΪһ¸öAPIÇëÇó±¾ÉíÒѾ­±È½ÏСÁË£¬Ñ¹ËõÊý¾ÝÁ¿Ëù´øÀ´µÄÐÔÄÜÌáÉý²»»áÌØ±ðÃ÷ÏÔ£¬ËùÒԾ͵¥¸öÇëÇóÀ´¿´£¬ÐÔÄܵÄÌáÉýÊDZȽÏСµÄ¡£²»¹ýÕâÊÇÏÂÒ»½ÚÒªÌÖÂÛµÄʶùÁË£¬Õâ¶ùÖ»ÊÇ˳´øËµÒ»Ï¡£

°²È«»úÖÆÐ¡×ܽá

ÕâÒ»½Ú˵ÁËÁ½ÖÖ°²È«»úÖÆ£¬Ò»°ãÀ´ËµµÚÒ»ÖÖÊDZêÅ䣬µÚ¶þÖÖÊôÓÚ¿ÉÑ¡ÅäÖᣲ»¹ýËæ×ÅÎÒ¹ú»¥ÁªÍø»ù´¡ÉèÊ©µÄÍêÉÆ£¬Òƶ¯É豸ÐÔÄܵÄÌá¸ß£¬ÒÔ¼°ÓÅ»¯¼¼ÊõµÄÌá¸ß£¬µÚ¶þÖÖÅäÖõÄȱµã£¨ËÙ¶ÈÂý£©ÕýÔÚÔ½À´Ô½Î¢²»×ãµÀ£¬Òò´ËHTTPSÒ²»á³ÉΪ²»¾ÃÖ®ºóµÄδÀ´AppµÄÍøÂç²ã°²È«»úÖÆ±êÅä¡£¸÷λ¼Ü¹¹Ê¦ÃÇ£¬Èç¹ûÄãµÄApp»¹Ã»ÓйÒHTTPS£¬ÏÖÔÚ¾ÍÒѾ­¿ÉÒÔ¿ªÊ¼×ÅÊÖÕâ¼þÊÂÇéÁË¡£

ÍøÂç²ãµÄÓÅ»¯·½°¸

ÍøÂç²ãµÄÓÅ»¯ÊÖ¶ÎÖ÷Òª´ÓÒÔÏÂÈý·½Ã濼ÂÇ£º

Õë¶ÔÁ´½Ó½¨Á¢»·½ÚµÄÓÅ»¯

Õë¶ÔÁ´½Ó´«ÊäÊý¾ÝÁ¿µÄÓÅ»¯

Õë¶ÔÁ´½Ó¸´ÓõÄÓÅ»¯

ÕâÈý·½ÃæÊÇËùÓÐÓÅ»¯ÊֶεÄÄÚÈÝ£¬¸÷ÖÖÎ廨°ËÃŵÄÓÅ»¯Êֶλù±¾É϶¼²»»áÌÓÍÑÕâÈý·½Ã棬ÏÂÃæÎҾͻá·Ö±ðÕë¶ÔÕâÈý·½Ã潲һϸ÷×Ô¶ÔÓ¦µÄÓÅ»¯ÊֶΡ£

1. Õë¶ÔÁ´½Ó½¨Á¢»·½ÚµÄÓÅ»¯

ÔÚAPI·¢ÆðÇëÇó½¨Á¢Á´½ÓµÄ»·½Ú£¬´óÖ»á·ÖÕâЩ²½Ö裺

·¢ÆðÇëÇó

DNSÓòÃû½âÎöµÃµ½IP

¸ù¾ÝIP½øÐÐÈý´ÎÎÕÊÖ£¨HTTPSËÄ´ÎÎÕÊÖ£©£¬Á´½Ó½¨Á¢³É¹¦

ÆäʵµÚÈý²½µÄÓÅ»¯ÊֶθúµÚ¶þ²½µÄÓÅ»¯ÊÖ¶ÎÊÇÒ»Öµģ¬ÎÒ»áÔÚ½²µÚ¶þ²½µÄʱºòÒ»Æð½²µô¡£

1.1 Õë¶Ô·¢ÆðÇëÇóµÄÓÅ»¯ÊÖ¶Î

ÆäʵҪ½â¾öµÄÎÊÌâ¾ÍÊÇÍøÂç²ã¸Ã²»¸ÃΪ´ËAPIµ÷Ó÷¢ÆðÇëÇó¡£

1.1.1 ʹÓûº´æÊֶμõÉÙÇëÇóµÄ·¢Æð´ÎÊý

¶ÔÓڴ󲿷ÖAPIµ÷ÓÃÇëÇóÀ´Ëµ£¬ÓÐЩAPIÇëÇóËù´øÀ´µÄÊý¾ÝµÄʱЧÐÔÊDZȽϳ¤µÄ£¬±ÈÈçÉÌÆ·ÏêÇ飬±ÈÈçAppƤ·ôµÈ¡£ÄÇôÎÒÃǾͿÉÒÔÕë¶ÔÕâЩÊý¾Ý×ö±¾µØ»º´æ£¬ÕâÑùÏ´ÎÇëÇóÕâЩÊý¾ÝµÄʱºò¾Í¿ÉÒÔ²»±ØÔÙ·¢ÆðеÄÇëÇó¡£

Ò»°ãÊǰÑAPIÃû×ֺͲÎÊýÆ´³ÉÒ»¸ö×Ö·û´®È»ºóÈ¡MD5×÷Ϊkey£¬´æ´¢¶ÔÓ¦·µ»ØµÄÊý¾Ý¡£ÕâÑùÏ´ÎÓÐͬÑùÇëÇóµÄʱºò¾Í¿ÉÒÔÖ±½Ó¶ÁÈ¡ÕâÀïÃæµÄÊý¾Ý¡£¹ØÓÚÕâÀïÓÐÒ»¸ö»º´æ²ßÂÔµÄÎÊÌâÐèÒªÌÖÂÛ£ºÊ²Ã´Ê±ºòÇåÀí»º´æ£¿ÒªÃ´¾ÍÊǸù¾Ý³¬Ê±Ê±¼äÏÞÖÆ½øÐÐÇåÀí£¬ÒªÃ´¾ÍÊǸù¾Ý»º´æÊý¾Ý´óС½øÐÐÇåÀí¡£Õâ¸ö²ßÂÔµÄÑ¡ÔñÒª¸ù¾Ý¾ßÌåAppµÄ²Ù×÷ÈÕÖ¾À´¾ö¶¨¡£

±ÈÈç°²¾Ó¿ÍApp£¬ÈÕÖ¾Êý¾Ý¼Ç¼ÏÔʾÓû§Æ½¾ùʹÓÃʱ³¤²»µ½3·ÖÖÓ£¬µ«ÊÇÓû§²é¿´·¿Ô´ÏêÇéµÄ´ÎÊý±È½Ï¶à£¬¶ø·¿Ô´ÏêÇéÊý¾ÝÁ¿½Ï´ó¡£ÄÇôÕâ¸öʱºò£¬¾ÍÊʺϸù¾ÝʹÓÃʱ³¤À´×ö»º´æ£¬ÎÒµ±Ê±¸ø°²¾Ó¿ÍÉèÖõĻº´æ³¬Ê±Ê±¼ä¾ÍÊÇ3·ÖÖÓ£¬ÕâÑùÄܹ»±£Ö¤Õâ¸ö»º´æÄܹ»Ôڴ󲿷ÖÓû§Ê¹ÓÃʱ¼ä²úÉú×÷Óá£àÅ£¬¼«¶ËÇé¿öÏÂ×öʲô»º´æÊֶβ»¿¼ÂÇ£¬Ö»ÒªÄܹ»·þÎñºÃ80%µÄÓû§¾Í¿ÉÒÔÁË£¬¶øÇÒÕë¶Ô¼«¶ËÇé¿ö²ÉÓõÄÓÅ»¯ÊÖ¶Î¶Ô´ó²¿·ÖÆÕͨÓû§¶øÑÔÊDz»±ØÒªµÄ£¬×öÁË·´¶ø»á¶ÔËûÃÇÓÐÓ°Ïì¡£

ÔÙ±ÈÈçÍøÂçͼƬ»º´æ£¬Êý¾ÝÁ¿»ù±¾É϶¼Ìرð´ó£¬ÕâÖ־ͱȽÏÊʺÏÕë¶Ô»º´æ´óСÀ´ÇåÀí»º´æµÄ²ßÂÔ¡£

ÁíÍ⣬֮ǰµÄ»º´æµÄǰÌá¶¼ÊÇ»ùÓÚÄÚ´æµÄ¡£ÎÒÃÇÒ²¿ÉÒÔ°ÑÐèÒªÇåÀíµÄ»º´æ´æ´¢ÔÚÓ²ÅÌÉÏ£¨APPµÄ±¾µØ´æ´¢£¬ÎÒ¾ÍÏÈÓÃÓ²ÅÌÀ´±íʾÁË£¬ËäÈ»ºÜÉÙÓÐÊÖ»úÓ²Å̵Ä˵·¨£¬¹þ¹þ£©£¬±ÈÈçÇ°ÃæÌáµ½µÄͼƬ»º´æ£¬ÒòΪͼƬºÜÓпÉÄÜÔںܳ¤Ê±¼äÖ®ºó£¬ÔÙ±»ÏÔʾµÄ£¬ÄÇôԭ±¾ÐèÒª±»ÇåÀíµÄͼƬ»º´æ£¬ÎÒÃǾͿÉÒÔ¿¼ÂÇ´æµ½Ó²ÅÌÉÏÈ¥¡£µ±Ï´ÎÔÙÓÐÏÔÊ¾ÍøÂçͼƬµÄÐèÇóµÄʱºò£¬ÎÒÃÇ¿ÉÒÔÏÈ´ÓÄÚ´æÖÐÕÒ£¬ÄÚ´æÕÒ²»µ½ÄǾʹÓÓ²ÅÌÉÏÕÒ£¬Õâ¶¼ÕÒ²»µ½£¬ÄǾͷ¢ÆðÇëÇó°É¡£

µ±È»£¬ÓÐЩʱЧÐԷdz£¶ÌµÄAPIÊý¾Ý£¬¾Í²»ÄÜʹÓÃÕâ¸ö·½·¨ÁË£¬±ÈÈçÓû§µÄ×ʽðÊý¾Ý£¬ÄǾÍÐèҪÿ´Î¶¼µ÷ÓÃÁË¡£

1.1.2 ʹÓòßÂÔÀ´¼õÉÙÇëÇóµÄ·¢Æð´ÎÊý

Õâ¸öÎÒÔÚÇ°ÃæÌáµ½¹ý£¬¾ÍÊÇÕë¶ÔÖØ¸´ÇëÇóµÄ·¢ÆðºÍÈ¡Ïû£¬ÊÇÓжÔÓ¦µÄÇëÇó²ßÂԵġ£ÎÒÃÇÏÈ˵ȡÏû²ßÂÔ¡£

Èç¹ûÊǽçÃæË¢ÐÂÇëÇóÕâÖÖ£¬¶øÇÒ´æÔÚÖØ¸´ÇëÇóµÄÇé¿ö£¨ÏÂÀ­Ë¢ÐÂʱ£¬ÔÚÇëÇó׎֮ǰÓû§²»¶ÏÖ´ÐÐÏÂÀ­²Ù×÷£©£¬ÄÇôÕâ¸öʱºò£¬ºóÃæÖØ¸´²Ù×÷µ¼ÖµÄAPIÇëÇó¾Í¿ÉÒÔ²»±Ø·¢ËÍÁË¡£

Èç¹ûÊÇÌõ¼þɸѡÕâÖÖ£¬ÄǾÍÈ¡ÏûÇ°ÃæÒѾ­·¢Ë͵ÄÇëÇó¡£ËäÈ»ºÜÓпÉÄÜÕâ¸öÇëÇóÒѾ­±»Ö´ÐÐÁË£¬ÄÇôȡÏûËù´øÀ´µÄÐÔÄÜÌáÉý¾Í»ù±¾Ã»ÓÐÁË¡£µ«Èç¹ûÕâ¸öÇëÇó»¹ÔÚ¶ÓÁÐÖдýÖ´Ðеϰ£¬ÄÇô¶ÔÓ¦µÄÕâ´ÎÁ´½Ó¾Í¿ÉÒÔÊ¡µôÁË¡£

ÒÔÉÏÊÇÒ»ÖÖ£¬ÁíÍâÒ»ÖÖÇé¿ö¾ÍÊÇÇëÇó²ßÂÔ£ºÀàËÆÓû§²Ù×÷ÈÕÖ¾µÄÇëÇó²ßÂÔ¡£

Óû§²Ù×÷»á´¥·¢²Ù×÷ÈÕÖ¾Éϱ¨Server£¬ÕâÖÖÇëÇóÌØ±ðƵ·±£¬µ«ÊÇÊǰµµØÀï½øÐе쬲»ÐèÒªÓû§¶Ô´ËÓÐËù¸ÐÖª¡£ËùÒÔҲû±ØÒª²Ù×÷Ò»´Î¾Í·¢ÆðÒ»´ÎµÄÇëÇó¡£ÔÚÕâÀï¾Í¿ÉÒÔ²ÉÓÃÕâÑùµÄ²ßÂÔ£ºÔÚ±¾µØ¼Ç¼Óû§µÄ²Ù×÷¼Ç¼£¬µ±¼Ç¼Âú30ÌõµÄʱºò·¢ÆðÒ»´ÎÇëÇ󽫲Ù×÷¼Ç¼ÉÏ´«µ½·þÎñÆ÷¡£È»ºóÿ´ÎAppÆô¶¯µÄʱºò£¬ÉÏ´«Ò»´ÎÉÏ´ÎÒÅÁôÏÂÀ´Ã»ÉÏ´«µÄ²Ù×÷¼Ç¼¡£ÕâÑùÄܹ»ÓÐЧ½µµÍÓû§É豸µÄºÄµçÁ¿£¬Í¬Ê±ÌáÉýÍøÂç²ãµÄÐÔÄÜ¡£

С×ܽá

Õë¶Ô½¨Á¢Á¬½ÓÕⲿ·ÖµÄÓÅ»¯¾ÍÊÇÕâÑùµÄÔ­Ôò£ºÄܲ»·¢ÇëÇóµÄ¾Í¾¡Á¿²»·¢ÇëÇ󣬱ØÐëÒª·¢ÇëÇóʱ£¬Äܺϲ¢ÇëÇóµÄ¾Í¾¡Á¿ºÏ²¢ÇëÇó¡£È»¶ø£¬ÈκÎÓÅ»¯Êֶζ¼ÊÇÓÐǰÌáµÄ£¬¶øÇÒÒ²²»Äܱ£Ö¤¶ÔËùÓÐÐèÇó¶¼ÄÜÆð×÷Óã¬ÓÐЩAPIÇëÇó¾ÍÊDz»·ûºÏÕâЩÓÅ»¯ÊÖ¶ÎǰÌáµÄ£¬ÄǾÍÀÏÀÏʵʵ·¢ÇëÇó°É¡£²»¹ýÕâÀàAPIÇëÇóËùÕ¼±ÈÀýÒ»°ã²»´ó£¬´ó²¿·ÖµÄÇëÇó¶¼»ò¶à»òÉÙ·ûºÏÓÅ»¯Ìõ¼þ£¬ËùÒÔÕë¶Ô·¢ËÍÇëÇóµÄÓÅ»¯Êֶλ¹ÊÇÖµµÃ×öµÄ¡£

1.2 & 1.3 Õë¶ÔDNSÓòÃû½âÎö×öµÄÓÅ»¯£¬ÒÔ¼°½¨Á¢Á´½ÓµÄÓÅ»¯

ÆäʵÔÚÕû¸öDNSÁ´Â·ÉÏÒ²ÊÇÓÐDNS»º´æµÄ£¬ÀíÂÛÉÏÒ²ÊÇÄܹ»Ìá¸ßËٶȵġ£Õâ¸öÁ´Â·ÉϵÄDNS»º´æÔÚPCÓû§ÉÏЧ¹ûÃ÷ÏÔ£¬ÒòΪPCÓû§µÄDNSÁ´Â·Ïà¶ÔÎȶ¨£¬ÐźÅÔ´²»»á±äÀ´±äÈ¥¡£µ«ÊÇÔÚÒÆ¶¯É豸µÄÓû§Õâ±ß£¬Á´Â·ÉϵÄDNS»º´æËù´øÀ´µÄÐÔÄÜÌáÉý¾Í²»Ì«Ã÷ÏÔÁË¡£ÒòÎªÒÆ¶¯É豸µÄʵ¼ÊʹÓó¡¾°±È½Ï¸´ÔÓ£¬ÍøÂçÐźÅÔ´»á¾­³£±ä»»£¬ÐźÅԴÿ±ä»»Ò»´Î£¬¶ÔÓ¦µÄDNS½âÎöÁ´Â·¾Í»á±ä»»Ò»´Î£¬ÄÇôԭÁ´Â·ÉϵÄDNS»º´æ¾Í²»Æð×÷ÓÃÁË¡£¶øÇÒÐźÅÔ´±ä»»µÄÇé¿öÌØ±ðÌØ±ðƵ·±£¬ËùÒÔ¶ÔÓÚÒÆ¶¯É豸Óû§À´Ëµ£¬Á´Â·µÄDNS»º´æÎÒÃÇ»ù±¾ÉÏ¿ÉÒÔĬÈÏΪûÓС£ËùÒԴ󲿷Öʱ¼äÊÇÊÖ»úϵͳ×Ô´øµÄ±¾µØDNS»º´æÔÚÆð×÷Ó㬵«ÊÇÒ»°ãÀ´Ëµ£¬Òƶ¯É豸ÉÏÍøµÄÐèÇóÒ²ÌØ±ðƵ·±£¬×¨ÃÅΪÎÒÃÇÕâ¸öAppËù×öµÄDNS»º´æºÜÓпÉÄܻᱻ±ðµÄDNS»º´æ¸ø¼·³öÈ¥±»ÇåÀíµô£¬ÕâÖÖÇé¿öÊÇÌØ±ð¶àµÄ£¬Óû§¿´Ò»»á¶ùÖªºõË¢Ò»ÏÂ΢²©²éһϵØÍ¼¹äÒ»¹äµãÆÀÔÙÁĸöQ£¬»ØÀ´Ö®ºóºÜÓпÉÄÜÊôÓÚÄã×Ô¼ºµÄAppµÄ±¾µØDNS»º´æ¾ÍûÁË¡£Õ⻹ûÍ꣬ÕâÀﻹÓÐÒ»¸öÖ»ÓÐÔÚÖйúÌØÉ«Éç»áÖ÷ÒåµÄ»¥ÁªÍø»·¾³ÖвŻáÓеÄÎÊÌ⣺¹úÄڵĻ¥ÁªÍø»·¾³ÓÉÓÚGFWµÄ´æÔÚ£¬¾ÍʹµÃDNS·þÎñËÙ¶È»á±ÈÕý³£Çé¿öÂý²»ÉÙ¡£

»ùÓÚÒÔÉÏÈý¸öÔ­ÒòËùµ¼ÖµÄ×îÖÕ½á¹û¾ÍÊÇ£¬APIÇëÇóÔÚDNS½âÎö½×¶ÎµÄºÄʱ»áºÜ¶à¡£

ÄÇôÕë¶ÔÕâ¸öµÄÓÅ»¯·½°¸¾ÍÊÇ£¬Ë÷ÐÔÖ±½Ó×ßIPÇëÇó£¬ÄDz»¾ÍÈÆ¹ýDNS·þÎñµÄºÄʱÁËÂï¡£

ÁíÍâÒ»¸ö£¬¾ÍÊÇÉÏÃæÌáµ½µÄ½¨Á¢Á´½ÓʱºòµÄµÚÈý²½£¬¹úÄÚµÄÍøÂç»·¾³·Ö±±ÍøÍ¨ÄϵçÐÅ£¨µ±È»Êµ¼ÊÇé¿ö¸ü¸´ÔÓ£¬ÕâÀïËæ±ã˵˵£©£¬²»Í¬·þÎñÉÌÖ®¼äµÄÁ¬½Ó£¬ÑÓʱÊǺܴóµÄ£¬ÎÒÃÇÐèÒªÏë°ì·¨ÈÃÓû§ÔÚ×îÊʺÏËûµÄIPÉϸøËûÌṩ·þÎñ£¬ÄÇô¾ÍÕë¶ÔÎÒÃÇÈÆ¹ýDNS·þÎñµÄÊÖ¶ÎÓÐÒ»¸ö¶îÍâÒªÇ󣺾¡¿ÉÄܲ»ÒªÈÃÓû§Ê¹ÓöÔËûÀ´ËµºÜÂýµÄIP¡£

ËùÒÔ×ÛÉÏËùÊö£¬·½°¸¾ÍÓ¦¸ÃÊÇÕâÑù£º±¾µØÓÐÒ»·ÝIPÁÐ±í£¬ÕâЩIPÊÇËùÓÐÌṩAPIµÄ·þÎñÆ÷µÄIP£¬Ã¿´ÎÓ¦ÓÃÆô¶¯µÄʱºò£¬Õë¶ÔÕâ¸öÁбíÀïµÄËùÓÐIPÈ¡pingÑÓʱʱ¼ä£¬È»ºóÈ¡ÑÓʱʱ¼ä×îСµÄÄǸöIP×÷Ϊ½ñºó·¢ÆðÇëÇóµÄIPµØÖ·¡£

Õë¶Ô½¨Á¢Á¬½ÓµÄÓÅ»¯ÊÖ¶ÎÆäʵÊǸúDNSÓòÃû½âÎöµÄÓÅ»¯ÊÖ¶ÎÊÇÒ»ÑùµÄ¡£²»¹ýÕâÐèÒªÄãµÄ·þÎñÆ÷Ìṩ·þÎñµÄÍøÂçÇé¿öÒª¶à£¬Ò»°ãÏÖÔڵķþÎñÆ÷¶¼ÊÇË«Íø¿¨£¬µçÐźÍÍøÍ¨¡£ÓÉÓÚÖйúÌØÉ«µÄ»¥ÁªÍøISP·Ö²¼£¬Äϱ±ÍøÂçÖ®¼ä´æÔÚÆ¿¾±£¬¶øÎÒÃÇAppÕë¶ÔÁ´½ÓµÄÓÅ»¯ÊÖ¶ÎÖ÷Òª¾ÍÊÇ×ÅÊÖÓÚÈçºÎ¼õÇáÕâ¸öÆ¿¾±¶ÔApp²úÉúµÄÓ°Ï죬ËùÒÔÐèҪά»¤Ò»¸öIPÁÐ±í£¬ÕâÑù¾ÍÄܾͽüÁ¬½ÓÁË£¬¾ÍÆðµ½ÁËÓÅ»¯µÄЧ¹û¡£

ÎÒÃÇÒ»°ã¶¼ÊÇÔÚÓ¦ÓÃÆô¶¯µÄʱºò»ñµÃ±¾µØÁбíÖÐËùÓÐIPµÄpingÖµ£¬È»ºóͨ¹ýNSURLProtocolµÄÊֶν«URLÖеÄHOSTÐÞ¸ÄΪÎÒÃÇÕÒµ½µÄ×î¿ìµÄIP¡£ÁíÍ⣬Õâ¸ö±¾µØIPÁбíÒ²»áÐèҪͨ¹ýÒ»¸öAPIÀ´Î¬»¤£¬Ò»°ãÊÇÿÌìµÚÒ»´ÎÆô¶¯µÄʱºò¶ÁÒ»´ÎAPI£¬È»ºó¸üе½±¾µØ¡£

Èç¹ûÄ㻹²»ÊìϤNSURLProtocolÓ¦¸ÃÔõÃ´Íæ£¬¿´Íê¹Ù·½ÎĵµºÍÕâÆªÎÄÕÂÒÔ¼°Õâ¸öDemoÖ®ºó£¬Äã¿Ï¶¨¾Í»áÁË£¬ÆäʵºÜ¼òµ¥µÄ¡£ÁíÍ⣬¸Õ²ÅÌáµ½ÄÇÆªÎÄÕµÄ×÷Õß(mattt)»¹Ð´ÁËÕâ¸ö»ùÓÚNSURLProtocolµÄ¹¤¾ß£¬Ï൱ºÃÓã¬ÊÇ¿ÉÒÔÖ±½ÓÄÃÀ´¼¯³Éµ½ÏîÄ¿Öеġ£

²»ÓÃNSURLProtocolµÄ»°£¬ÓÃÆäËûÊÖ¶ÎÒ²¿ÉÒÔ×öµ½ÕâÒ»µã£¬µ«ÄÇЩÊÖ¶ÎδÃâÓֱȽÏÓÞ´À¡£

2. Õë¶ÔÁ´½Ó´«ÊäÊý¾ÝÁ¿µÄÓÅ»¯

Õâ¸öºÜºÃÀí½â£¬´«ÊäµÄÊý¾ÝÉÙÁË£¬ÄÇô×ÔÈ»ËٶȾÍÉÏÈ¥ÁË¡£ÕâÀïûʲô»¨Ñù¿ÉÒÔ½²µÄ£¬¾ÍÊÇѹËõß¡£¸÷ÖÖѹËõ¡£

3. Õë¶ÔÁ´½Ó¸´ÓõÄÓÅ»¯

½¨Á¢Á´½Ó±¾ÉíÊÇÊôÓڱȽÏÏûºÄ×ÊÔ´µÄ²Ù×÷£¬ºÄµçºÄʱ¡£SPDY×Ô´øÁ´½Ó¸´ÓÃÒÔ¼°Êý¾ÝѹËõµÄ¹¦ÄÜ£¬ËùÒÔ·þÎñ¶ËÖ§³ÖSPDYµÄʱºò£¬AppÖ±½Ó¹ÒSPDY¾Í¿ÉÒÔÁË¡£Èç¹û·þÎñ¶Ë²»Ö§³ÖSPDY£¬Ò²¿ÉÒÔʹÓÃPipeLine£¬Æ»¹ûÔ­Éú×Ô´øÕâ¸ö¹¦ÄÜ¡£

Ò»°ãÀ´ËµÒµ½çÄÚÆÕ±éµÄÈÏʶÊÇSPDYÓÅÓÚPipeLine£¬È»ºó¼´±ãÈç´Ë£¬SPDYÄܹ»´øÀ´µÄÍøÂç²ãЧÂÊÌáÉýÆäʵҲûÓÐÎÄÏ×ÉϵÄͼ±íÄÇôÃ÷ÏÔ£¬µ«»¹ÊÇÓÐÐÔÄÜÌáÉýµÄ¡£»¹ÓÐÁíÍâÒ»ÖֱȽϱ¿µÄÁ´½Ó¸´Óõķ½·¨£¬¾ÍÊÇά»¤Ò»¸ö¶ÓÁУ¬È»ºó½«¶ÓÁÐÀïµÄÇëÇóѹËõ³ÉÒ»¸öÇëÇó·¢³öÈ¥£¬Ö®ËùÒÔ»á´æÔÚÖÍÁôÔÚ¶ÓÁÐÖеÄÇëÇó£¬ÊÇÒòΪÔÚÉÏÒ»¸öÇëÇó»¹ÔÚÍâÃæÆ®µÄʱºò¡£ÕâÖÖ×ö·¨×îÖÕµÄЧ¹û±íÃæÉÏ¿´¸úÁ´½Ó¸´Óòî±ð²»´ó£¬µ«²¢²»ÊÇÕæÕýµÄÁ´½Ó¸´Óã¬Ö»ÄÜ˵ÊÇÇëÇóºÏ²¢¡£

»¹ÊÇ˵»ØÀ´£¬ÎÒ½¨Òé×îºÃÊÇÓÃSPDY£¬SPDYºÍpipelineËäÈ»¶¼ÊôÓÚÁ´½Ó¸´Óõķ¶³ë£¬µ«ÊÇpipeline²¢²»ÊÇÕæÕýÒâÒåÉϵÄÁ´½Ó¸´Óã¬SPDYµÄÁ´½Ó¸´ÓÃÏà¶Ôpipeline¶øÑÔ¸üΪ³¹µ×¡£SPDYĿǰҲÓÐÏֳɵĿͻ§¶ËSDK¿ÉÒÔʹÓã¬Ò»¸öÊÇtwitterµÄCocoaSPDY£¬ÁíÒ»¸öÊÇVoxer/iSPDY£¬ÕâÁ½¸ö¿â¶¼ºÜ»îÔ¾£¬´ó¼Ò¿ÉÒÔÌôºÏÊʵIJÉÓá£

²»¹ýĿǰҵ½çÇ÷ÊÆÊÇÇãÏòÓÚʹÓÃHTTP/2.0À´´úÌæSPDY£¬²»¹ýĿǰHTTP/2.0»¹Ã»ÓÐÕýʽ³ǫ̈£¬Ïà¹ØÊµÏִ󲿷ֶ¼´¦ÔÚdemo½×¶Î£¬ËùÒÔÎÒÃÇ»¹ÊÇÏÈSPDY¸ãÆð¾ÍºÃÁË¡£Î´À´ºÜÓпÉÄÜ»á·ÅÆúSPDY£¬×ª¶ø²ÉÓÃHTTP/2.0À´ÊµÏÖÍøÂçµÄÓÅ»¯¡£ÕâÊÇÒªÌáÐѸ÷λ¼Ü¹¹Ê¦×¢ÒâµÄÊÂÇé¡£àÅ£¬ÎÒÒ²²»ÖªµÀHTTP/2.0ʲôʱºòÄܳöÀ´¡£

ÓæËµÍêÁË£¬ÓãÀ´ÁË

ÕâÀïÊÇÎÒµ±ÄêÉè¼Æ²¢ÊµÏֵݲ¾Ó¿ÍµÄÍøÂç²ã¼Ü¹¹´úÂë¡£µ±È»£¬¸ÃÍÑÃôµÄµØ·½ÎÒ¶¼ÒѾ­ÍÑÃôÁË£¬ËùÒԱ಻¹ýÊÇÕý³£µÄ£¬¹þ¹þ¹þ¡£µ«ÊÇ´úÂë±È½ÏÆëÈ«£¬ÖØÒªµØ·½×¢ÊÍÎÒҲдÁ˺ܶࡣÁíÍ⣬ΪÁËÈôó¼ÒÄܹ»°ÑÕâЩ´úÂë¿´Ã÷°×£¬ÎÒ»¹¸½´øÁ˵±Äê½éÉÜÕâ¸ö¿ò¼ÜÑݽ²Ê±µÄPPT¡£(²¹³ä˵Ã÷һϣ¬ÆÀÂÛÇøºÃ¶àÈËÎÊPPTÕÒ²»×ÅÔÚÄĶù£¬PPTÒ²ÔÚÉÏÃæÌáµ½µÄrepoÀïÃæ£¬ÊǸökeyºó׺ÃûµÄÎļþ£¬ÓÃkeynote´ò¿ª)

È»ºó¾ÍÊÇ£¬µ±ÄêÒ²ÓкܶàÎÊÌâÆäʵ¿¼Âǵò¢Ã»ÓÐÏÖÔÚÇå³þ£¬ËùÒÔÓÐЩµØ·½»¹ÊÇ×öµÃ²»¹»ºÃ£¬±ÈÈçÀ¹½ØÆ÷ºÍ¼Ì³Ð¡£¶øÇÒµ±Ê±µÄÓÅ»¯ÊÖ¶ÎÖ»Óб¾µØcache£¬°²¾Ó¿ÍûÓÐÄÇô¶àIP¿ÉÒÔ¸øÎÒping£¬µ±ÄêҲûÁ÷ÐÐSPDY£¬¶øÇÒAPIÒ²»¹²»Ö§³ÖHTTPS£¬ËùÒÔµ±Ê±µÄ´úÂëÀïÃæÃ»ÓÐÔÚÕâЩµØ·½×öÓÅ»¯£¬±È½Ïԭʼ¡£È»¶øÕû¸ö¼Ü¹¹µÄ»ù±¾Ë¼Â·Ò»Ö±Ã»Óб仯£ºÓÅÏÈ·þÎñÓÚÒµÎñ·½¡£ÁíÍ⣬°²¾Ó¿ÍµÄÍøÂç²ã¶àÁËÒ»¸öserviceµÄ¸ÅÄÕâÊÇÎÒÕâÆªÎÄÕÂÖÐûÓн²µÄ¡£Ö÷ÒªÊÇÒòΪ°²¾Ó¿ÍµÄAPIÌṩ·½ºÜ¶à£¬¶þÊÖ·¿£¬×â·¿£¬Ð·¿£¬XÏîÄ¿µÈµÈAPI¶¼ÊDz»Í¬µÄAPI teamÌṩµÄ£¬ÒÔservice×÷Çø·Ö£¬Èç¹ûÄãµÄappÒ²ÊÇÀàËÆµÄÇé¿ö£¬ÎÒÒ²½¨ÒéÄãÉè¼ÆÒ»Ì×service»úÖÆ¡£ÏÖÔÚÕâЩservice±»ÎÒɾµÃֻʣÏÂÒ»¸ögoogleµÄservice£¬ÒòΪÆäËûservice¶¼ÊôÓÚÃô¸ÐÄÚÈÝ¡£

ÁíÍ⣬ÕâÀïÃæÌṩµÄPPTÎÒºÜÏ£Íû´ó¼ÒÄܹ»»¨Ê±¼äÈ¥¿´¿´£¬ÔÚPPTÀïÃæÓÐЩ¸ü¼ÓϸµÄ¶«Î÷ÎÒÔÚ²©¿ÍÀïûÓÐд£¬Ö÷ÒªÊÇÎұȽÏÀÁ£¬È»ºóÕâÆªÎÄÕÂÍϵÄʱ¼ä±È½Ï³¤ÁË£¬»¨Ê±¼ä°áÔËÕâ¸öûʲôÒâ˼£¬²»¹ýÄÚÈÝ»¹ÊÇÖµµÃ¸÷λ¶ÁÕßÈ¥¿´µÄ¡£¹ØÓÚPPTÀïÃæ´ó¼ÒÓÐʲôÎÊÌâµÄ£¬Ò²¿ÉÒÔÔÚÆÀÂÛÇøÎÊ£¬ÎÒ¶¼»á»Ø´ð¡£

×ܽá

µÚÒ»²¿·ÖÖ÷Òª½²ÁËÍøÂç²ãÓ¦µ±ÈçºÎ¸úÒµÎñ²ã½øÐÐÊý¾Ý½»»¥£¬½øÐÐÊý¾Ý½»»¥Ê±²ÉÓÃÔõÑùµÄÊý¾Ý¸ñʽ£¬ÒÔ¼°Éè¼ÆÊ±´úÂë½á¹¹ÉϵÄһЩÎÊÌ⣬ÖîÈç¼Ì³ÐµÄ´¦Àí£¬»Øµ÷µÄ´¦Àí£¬½»»¥·½Ê½µÄÑ¡Ôñ£¬reformerµÄÉè¼Æ£¬±£³ÖÊý¾Ý¿É¶ÁÐԵȵȵȵȣ¬Ö÷ÒªÆ«ÖØÓÚÉè¼Æ£¨Õâ¿ÉÊÇÒÕÊõ»î£¬¹þ¹þ¹þ£©¡£

µÚ¶þ²¿·Ö½²ÁËÍøÂ簲ȫÉÏ£¬¿Í»§¶ËÒª×öµÄÁ½µã¡£µ±È»£¬´ÓÍøÂ簲ȫµÄ½Ç¶ÈÉϽ²£¬·þÎñ¶ËÒ²Òª×öºÜ¶àºÜ¶àÊÂÇ飬¿Í»§¶ËÒª×öµÄһЩ±ß½Çϸ½ÚµÄÊÂÇéÒ²»¹»áÓкܶ࣬±ÈÈç×öһЩ´úÂë»ìÏý£¬¾¡¿ÉÄܱÜÃâ´úÂëÖÐÃ÷ÎÄչʾkey¡£²»¹ý´óÍ·Ö÷Òª¾ÍÊÇÕâÁ½¸ö£¬¶øÇÒÒ²¶¼ÊÇÐèÒª·þÎñ¶ËͬѧȥÅäºÏµÄ¡£Ö÷ÒªÆ«ÖØÓÚ½éÉÜ¡££¨Ö÷ÒªÊÇҲûɶºÃʵ¼ùµÄ£¬googleһϽ̳ÌÕÕ×ÅÀ´¾ÍºÃÁË£©¡£

µÚÈý²¿·Ö½²ÁËÓÅ»¯£¬ÓÅ»¯µÄËùÓз½Ãæ¶¼ÒѾ­ÁгöÀ´ÁË£¬Èç¹ûÒµ½çÔÙÓÐÆßÆß°Ë°ËµÄ±ðµÄÊֶΣ¬Ò²»ù±¾ÌÓÀë²»³ö±¾Îĵķ¶Î§¡£ÕâÀïÓÐЩÓÅ»¯ÊÖ¶ÎÊÇÐèÒª·þÎñ¶ËͬѧÅäºÏµÄ£¬ÓÐЩ²»ÐèÒª£¬´ó¼Ò¿´¸÷×ÔÇé¿öÀ´¾ö¶¨¡£Ö÷ÒªÆ«ÖØÓÚʵ¼ù¡£

×îºó¸ø³öÁËÎÒ֮ǰÔÚ°²¾Ó¿Í×öµÄÍøÂç²ã¼Ü¹¹µÄÖ÷Òª´úÂ룬ÒÔ¼°µ±Ê±Ñݽ²Ê±µÄPPT¡£¹ØÓÚ´úÂë»òPPTÖÐÓÐÈκÎÎÊÌ⣬¶¼¿ÉÒÔÔÚÆÀÂÛÇøÎÊÎÒ¡£

ÕâһƪÎÄÕ³öµÃ±È½ÏÍí£¬ÒòΪ¹«Ë¾µÄÊÂÇ飬Öмä¼ä¸ôÁËÒ»¸öÀñ°Ý£¬Ï£Íû´ó¼ÒÁ½⡣ÁíÍ⣬¸ôÁËÒ»¸öÀñ°ÝÖ®ºóÎÒÔÙд£¬·¢ÏÖÓÐЩµØ·½ÎÒÒѾ­Ïë²»ÆðÀ´µ±³õÊÇÓ¦¸ÃÔõôÐÐÎÄÏÂÈ¥µÄÁË£¬È»ºó·¢Ö®Ç°ÎÒ°ÑÎÄÕÂÓÖ¿´Á˼¸±é£¬¾¡¿ÉÄÜ°Ñ¶ÏÆ¬µÄµØ·½Ä¨Æ½ÁË£¬Èç¹û´ó¼Ò¶ÁÆðÀ´ÓÐʲôµØ·½¸Ð¾õÆæ¹ÖµÄ£¬»òÕß½²µ½Ò»°ë¾ÍûÁ˵ģ¬ÄÇÓ¦¸Ã¾ÍÊÇ¶ÏÆ¬ÁË¡£ÔÚÆÀÂÛÇø¸úÎÒ˵һÏ£¬ÎÒ²¹ÉÏÈ¥¡£

È»ºóÈç¹ûÓÐÐèÒª¿±ÎóµÄµØ·½£¬Ò²ÇëÔÚÆÀÂÛÇøÖ¸³ö£¬°ïÖúÎÒ°Ñ´íµÄµØ·½¶©Õý»ØÀ´£¬Èç¹ûÓÐû½²µ½µÄµØ·½£¬µ«ÄãÓÖÌØ±ðÏëÒªÁ˽âµÄ£¬Ò²¿ÉÒÔÔÚÆÀÂÛÇøÌá³öÀ´£¬ÎһᲹÉÏÈ¥¡£Ëµ²»¶¨¿´ÍêÖ®ºóÄãÄÔ´üÀﻹ»áÓкܶà¸öÎʺţ¬Ò²ÇëÔÚÆÀÂÛÇøÎʳöÀ´¹þ£¬Ëµ²»¶¨±ðÈËÒ²ÓиúÄãÒ»ÑùµÄÎÊÌ⣬Ëû¾ÍÄÜÔÚÆÀÂÛÇøÕÒµ½´ð°¸ÁË¡£

   
´Îä¯ÀÀ       
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì