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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëÀí½â GCD£¨¶þ£©
 
×÷Õߣºlikendsl À´Ô´£ºDerek Selander ·¢²¼ÓÚ 2015-02-03
  1946  次浏览      27
 

ÔÚ±¾ÏµÁеĵÚÒ»²¿·ÖÖУ¬ÄãÒѾ­Ñ§µ½³¬¹ýÄãÏëÏñµÄ¹ØÓÚ²¢·¢¡¢Ïß³ÌÒÔ¼°GCD ÈçºÎ¹¤×÷µÄ֪ʶ¡£Í¨¹ýÔÚ³õʼ»¯Ê±ÀûÓÃdispatch_once£¬Äã´´½¨ÁËÒ»¸öḬ̈߳²È«µÄ PhotoManager µ¥Àý£¬¶øÇÒÄãͨ¹ýʹÓà dispatch_barrier_async ºÍdispatch_sync µÄ×éºÏʹµÃ¶Ô Photos Êý×éµÄ¶ÁÈ¡ºÍдÈë¶¼±äµÃḬ̈߳²È«ÁË¡£

³ýÁËÉÏÃæÕâЩ£¬Ä㻹ͨ¹ýÀûÓà dispatch_after À´ÑÓ³ÙÏÔʾÌáʾÐÅÏ¢£¬ÒÔ¼°ÀûÓà dispatch_async ½« CPU Ãܼ¯ÐÍÈÎÎñ´Ó ViewController µÄ³õʼ»¯¹ý³ÌÖаþÀë³öÀ´Òì²½Ö´ÐУ¬´ïµ½ÁËÔöǿӦÓõÄÓû§ÌåÑéµÄÄ¿µÄ¡£

Èç¹ûÄãÒ»Ö±¸ú×ŵÚÒ»²¿·ÖµÄ½Ì³ÌÔÚд´úÂ룬ÄÇÄã¿ÉÒÔ¼ÌÐøÄãµÄ¹¤³Ì¡£µ«Èç¹ûÄãûÓÐÍê³ÉµÚÒ»²¿·ÖµÄ¹¤×÷£¬»òÕß²»ÏëÖØÓÃÄãµÄ¹¤³Ì£¬Äã¿ÉÒÔÏÂÔØµÚÒ»²¿·Ö×îÖյĴúÂë¡£

ÄǾÍÈÃÎÒÃÇÀ´¸üÉîÈëµØÌ½Ë÷ GCD °É£¡

¾ÀÕý¹ýÔ絯³öµÄÌáʾ

Äã¿ÉÄÜÒѾ­×¢Òâµ½µ±Äã³¢ÊÔÓà Le Internet Ñ¡ÏîÀ´Ìí¼ÓͼƬʱ£¬Ò»¸ö UIAlertView »áÔÚͼƬÏÂÔØÍê³É֮ǰ¾Íµ¯³ö£¬ÈçÏÂÈçËùʾ£º

ÎÊÌâµÄÖ¢½áÔÚ PhotoManagers µÄ downloadPhotoWithCompletionBlock: ÀËüĿǰµÄʵÏÖÈçÏ£º

- (void)downloadPhotosWithCompletionBlock:(BatchPhotoDownloadingCompletionBlock)completionBlock
{
    __block NSError *error;
 
    for (NSInteger i = 0; i < 3; i++) {
        NSURL *url;
        switch (i) {
            case 0:
                url = [NSURL URLWithString:kOverlyAttachedGirlfriendURLString];
                break;
            case 1:
                url = [NSURL URLWithString:kSuccessKidURLString];
                break;
            case 2:
                url = [NSURL URLWithString:kLotsOfFacesURLString];
                break;
            default:
                break;
        }
 
        Photo *photo = [[Photo alloc] initwithURL:url
                              withCompletionBlock:^(UIImage *image, NSError *_error) {
                                  if (_error) {
                                      error = _error;
                                  }
                              }];
 
        [[PhotoManager sharedManager] addPhoto:photo];
    }
 
    if (completionBlock) {
        completionBlock(error);
    }
}

ÔÚ·½·¨µÄ×îºóÄãµ÷ÓÃÁË completionBlock ¡ª¡ªÒòΪ´ËʱÄã¼ÙÉèËùÓеÄÕÕÆ¬¶¼ÒÑÏÂÔØÍê³É¡£µ«ºÜ²»ÐÒ£¬´Ëʱ²¢²»Äܱ£Ö¤ËùÓеÄÏÂÔØ¶¼ÒÑÍê³É¡£

Photo ÀàµÄʵÀý·½·¨ÓÃij¸ö URL ¿ªÊ¼ÏÂÔØÄ³¸öÎļþ²¢Á¢¼´·µ»Ø£¬µ«´ËʱÏÂÔØ²¢Î´Íê³É¡£»»¾ä»°Ëµ£¬µ±downloadPhotoWithCompletionBlock: ÔÚÆäĩβµ÷Óà completionBlock ʱ£¬Ëü¾Í¼ÙÉèÁËËü×Ô¼ºËùʹÓõķ½·¨È«¶¼ÊÇͬ²½µÄ£¬¶øÇÒÿ¸ö·½·¨¶¼Íê³ÉÁËËüÃǵŤ×÷¡£

È»¶ø£¬-[Photo initWithURL:withCompletionBlock:] ÊÇÒì²½Ö´Ðе쬻áÁ¢¼´·µ»Ø¡ª¡ªËùÒÔÕâÖÖ·½Ê½Ðв»Í¨¡£

Òò´Ë£¬Ö»ÓÐÔÚËùÓеÄͼÏñÏÂÔØÈÎÎñ¶¼µ÷ÓÃÁËËüÃÇ×Ô¼ºµÄ Completion Block Ö®ºó£¬downloadPhotoWithCompletionBlock: ²ÅÄܵ÷ÓÃËü×Ô¼ºµÄ completionBlock ¡£ÎÊÌâÊÇ£ºÄã¸ÃÈçºÎ¼à¿Ø²¢·¢µÄÒ첽ʼþ£¿Äã²»ÖªµÀËüÃǺÎʱÍê³É£¬¶øÇÒËüÃÇÍê³ÉµÄ˳ÐòÍêÈ«ÊDz»È·¶¨µÄ¡£

»òÐíÄã¿ÉÒÔдһЩ±È½Ï Hacky µÄ´úÂ룬Óöà¸ö²¼¶ûÖµÀ´¼Ç¼ÿ¸öÏÂÔØµÄÍê³ÉÇé¿ö£¬µ«ÕâÑù×ö¾ÍȱʧÁËÀ©Õ¹ÐÔ£¬¶øÇÒ˵ʵ»°£¬´úÂë»áºÜÄÑ¿´¡£

ÐÒÔ˵ÄÊÇ£¬ ½â¾öÕâÖÖ¶Ô¶à¸öÒì²½ÈÎÎñµÄÍê³É½øÐÐ¼à¿ØµÄÎÊÌ⣬ǡºÃ¾ÍÊÇÉè¼Æ dispatch_group µÄÄ¿µÄ¡£

Dispatch Groups£¨µ÷¶È×飩

Dispatch Group »áÔÚÕû¸ö×éµÄÈÎÎñ¶¼Íê³Éʱ֪ͨÄã¡£ÕâЩÈÎÎñ¿ÉÒÔÊÇͬ²½µÄ£¬Ò²¿ÉÒÔÊÇÒì²½µÄ£¬¼´±ãÔÚ²»Í¬µÄ¶ÓÁÐÒ²ÐС£¶øÇÒÔÚÕû¸ö×éµÄÈÎÎñ¶¼Íê³Éʱ£¬Dispatch Group ¿ÉÒÔÓÃͬ²½µÄ»òÕßÒì²½µÄ·½Ê½Í¨ÖªÄã¡£ÒòΪҪ¼à¿ØµÄÈÎÎñÔÚ²»Í¬¶ÓÁУ¬ÄǾÍÓÃÒ»¸ö dispatch_group_t µÄʵÀýÀ´¼ÇÏÂÕâЩ²»Í¬µÄÈÎÎñ¡£

µ±×éÖÐËùÓеÄʼþ¶¼Íê³Éʱ£¬GCD µÄ API ÌṩÁËÁ½ÖÖ֪ͨ·½Ê½¡£

µÚÒ»ÖÖÊÇ dispatch_group_wait £¬Ëü»á×èÈûµ±Ç°Ị̈߳¬Ö±µ½×éÀïÃæËùÓеÄÈÎÎñ¶¼Íê³É»òÕߵȵ½Ä³¸ö³¬Ê±·¢Éú¡£ÕâÇ¡ºÃÊÇÄãĿǰËùÐèÒªµÄ¡£

´ò¿ª PhotoManager.m£¬ÓÃÏÂÁÐʵÏÖÌæ»» downloadPhotosWithCompletionBlock:£º

- (void)downloadPhotosWithCompletionBlock:(BatchPhotoDownloadingCompletionBlock)completionBlock
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 1
 
        __block NSError *error;
        dispatch_group_t downloadGroup = dispatch_group_create(); // 2
 
        for (NSInteger i = 0; i < 3; i++) {
            NSURL *url;
            switch (i) {
                case 0:
                    url = [NSURL URLWithString:kOverlyAttachedGirlfriendURLString];
                    break;
                case 1:
                    url = [NSURL URLWithString:kSuccessKidURLString];
                    break;
                case 2:
                    url = [NSURL URLWithString:kLotsOfFacesURLString];
                    break;
                default:
                    break;
            }
 
            dispatch_group_enter(downloadGroup); // 3
            Photo *photo = [[Photo alloc] initwithURL:url
                                  withCompletionBlock:^(UIImage *image, NSError *_error) {
                                      if (_error) {
                                          error = _error;
                                      }
                                      dispatch_group_leave(downloadGroup); // 4
                                  }];
 
            [[PhotoManager sharedManager] addPhoto:photo];
        }
        dispatch_group_wait(downloadGroup, DISPATCH_TIME_FOREVER); // 5
        dispatch_async(dispatch_get_main_queue(), ^{ // 6
            if (completionBlock) { // 7
                completionBlock(error);
            }
        });
    });
}

°´ÕÕ×¢Ê͵Ä˳Ðò£¬Äã»á¿´µ½£º

ÒòΪÄãÔÚʹÓõÄÊÇͬ²½µÄ dispatch_group_wait £¬Ëü»á×èÈûµ±Ç°Ị̈߳¬ËùÒÔÄãÒªÓà dispatch_async ½«Õû¸ö·½·¨·ÅÈëºǫ́¶ÓÁÐÒÔ±ÜÃâ×èÈûÖ÷Ï̡߳£

´´½¨Ò»¸öÐ嵀 Dispatch Group£¬ËüµÄ×÷ÓþÍÏñÒ»¸öÓÃÓÚδÍê³ÉÈÎÎñµÄ¼ÆÊýÆ÷¡£

dispatch_group_enter ÊÖ¶¯Í¨Öª Dispatch Group ÈÎÎñÒѾ­¿ªÊ¼¡£Äã±ØÐë±£Ö¤ dispatch_group_enter ºÍdispatch_group_leave ³É¶Ô³öÏÖ£¬·ñÔòÄã¿ÉÄÜ»áÓöµ½¹îÒìµÄ±ÀÀ£ÎÊÌâ¡£

ÊÖ¶¯Í¨Öª Group ËüµÄ¹¤×÷ÒѾ­Íê³É¡£ÔÙ´Î˵Ã÷£¬Äã±ØÐëҪȷ±£½øÈë Group µÄ´ÎÊýºÍÀ뿪 Group µÄ´ÎÊýÏàµÈ¡£

dispatch_group_wait »áÒ»Ö±µÈ´ý£¬Ö±µ½ÈÎÎñÈ«²¿Íê³É»òÕß³¬Ê±¡£Èç¹ûÔÚËùÓÐÈÎÎñÍê³Éǰ³¬Ê±ÁË£¬¸Ãº¯Êý»á·µ»ØÒ»¸ö·ÇÁãÖµ¡£Äã¿ÉÒÔ¶Ô´Ë·µ»ØÖµ×öÌõ¼þÅжÏÒÔÈ·¶¨ÊÇ·ñ³¬³öµÈ´ýÖÜÆÚ£»È»¶ø£¬ÄãÔÚÕâÀïÓà DISPATCH_TIME_FOREVER ÈÃËüÓÀÔ¶µÈ´ý¡£ËüµÄÒâ˼£¬ÎðÓ¹ÖÃÒɾÍÊÇ£¬ÓÀ£­Ô¶£­µÈ£­´ý£¡ÕâÑùºÜºÃ£¬ÒòΪͼƬµÄ´´½¨¹¤×÷×ÜÊÇ»áÍê³ÉµÄ¡£

´Ëʱ´Ë¿Ì£¬ÄãÒѾ­È·±£ÁË£¬ÒªÃ´ËùÓеÄͼƬÈÎÎñ¶¼ÒÑÍê³É£¬ÒªÃ´·¢ÉúÁ˳¬Ê±¡£È»ºó£¬ÄãÔÚÖ÷Ïß³ÌÉÏÔËÐÐcompletionBlock »Øµ÷¡£Õâ»á½«¹¤×÷·Åµ½Ö÷Ïß³ÌÉÏ£¬²¢ÔÚÉÔºóÖ´ÐС£

×îºó£¬¼ì²é completionBlock ÊÇ·ñΪ nil£¬Èç¹û²»ÊÇ£¬ÄǾÍÔËÐÐËü¡£

±àÒë²¢ÔËÐÐÄãµÄÓ¦Ó㬳¢ÊÔÏÂÔØ¶à¸öͼƬ£¬¹Û²ìÄãµÄÓ¦ÓÃÊÇÔÚºÎʱÔËÐÐ completionBlock µÄ¡£

×¢Ò⣺Èç¹ûÄãÊÇÔÚÕæ»úÉÏÔËÐÐÓ¦Ó㬶øÇÒÍøÂç»î¶¯·¢ÉúµÃÌ«¿ìÒÔÖÂÄÑÒÔ¹Û²ì completionBlock ±»µ÷ÓõÄʱ¿Ì£¬ÄÇôÄã¿ÉÒÔÔÚ Settings Ó¦ÓÃÀïµÄ¿ª·¢ÕßÏà¹Ø²¿·ÖÀï´ò¿ªÒ»Ð©ÍøÂçÉèÖã¬ÒÔÈ·±£´úÂë°´ÕÕÎÒÃÇËùÆÚÍûµÄÄÇÑù¹¤×÷¡£Ö»ÐèÈ¥Íù Network Link Conditioner Çø£¬¿ªÆôËü£¬ÔÙÑ¡ÔñÒ»¸ö Profile£¬¡°Very Bad Network¡± ¾Í²»´í¡£

Èç¹ûÄãÊÇÔÚÄ£ÄâÆ÷ÀïÔËÐÐÓ¦Óã¬Äã¿ÉÒÔʹÓà À´×Ô GitHub µÄ Network Link Conditioner À´¸Ä±äÍøÂçËÙ¶È¡£Ëü»á³ÉΪÄ㹤¾ßÏäÖеÄÒ»¸öºÃ¹¤¾ß£¬ÒòΪËüÇ¿ÖÆÄãÑо¿ÄãµÄÓ¦ÓÃÔÚÁ¬½ÓËٶȲ¢·Ç×î¼ÑµÄÇé¿öÏ»á±ä³ÉʲôÑù¡£

ĿǰΪֹµÄ½â¾ö·½°¸»¹²»´í£¬µ«ÊÇ×ÜÌåÀ´Ëµ£¬Èç¹û¿ÉÄÜ£¬×îºÃ»¹ÊÇÒª±ÜÃâ×èÈûÏ̡߳£ÄãµÄÏÂÒ»¸öÈÎÎñÊÇÖØÐ´Ò»Ð©·½·¨£¬ÒԱ㵱ËùÓÐÏÂÔØÈÎÎñÍê³ÉʱÄÜÒ첽֪ͨÄã¡£

ÔÚÎÒÃÇתÏòÁíÍâÒ»ÖÖʹÓà Dispatch Group µÄ·½Ê½Ö®Ç°£¬ÏÈ¿´Ò»¸ö¼òÒªµÄ¸ÅÊö£¬¹ØÓÚºÎʱÒÔ¼°ÔõÑùʹÓÃÓÐ×Ų»Í¬µÄ¶ÓÁÐÀàÐ굀 Dispatch Group £º

×Ô¶¨Òå´®ÐжÓÁУºËüºÜÊʺϵ±Ò»×éÈÎÎñÍê³Éʱ·¢³ö֪ͨ¡£

Ö÷¶ÓÁУ¨´®ÐУ©£ºËüÒ²ºÜÊʺÏÕâÑùµÄÇé¿ö¡£µ«Èç¹ûÄãҪͬ²½µØµÈ´ýËùÓй¤×÷µØÍê³É£¬ÄÇÄã¾Í²»Ó¦¸ÃʹÓÃËü£¬ÒòΪÄã²»ÄÜ×èÈûÖ÷Ï̡߳£È»¶ø£¬Ò첽ģÐÍÊÇÒ»¸öºÜÓÐÎüÒýÁ¦µÄÄÜÓÃÓÚÔÚ¼¸¸ö½Ï³¤ÈÎÎñ£¨ÀýÈçÍøÂçµ÷Óã©Íê³Éºó¸üРUI µÄ·½Ê½¡£

²¢·¢¶ÓÁУºËüÒ²ºÜÊÊºÏ Dispatch Group ºÍÍê³Éʱ֪ͨ¡£

Dispatch Group£¬µÚ¶þÖÖ·½Ê½

ÉÏÃæµÄÒ»Çж¼ºÜºÃ£¬µ«ÔÚÁíÒ»¸ö¶ÓÁÐÉÏÒì²½µ÷¶ÈÈ»ºóʹÓà dispatch_group_wait À´×èÈûʵÔÚÏÔµÃÓÐЩ±¿×¾¡£Êǵ쬻¹ÓÐÁíÒ»ÖÖ·½Ê½¡­¡­

ÔÚ PhotoManager.m ÖÐÕÒµ½ downloadPhotosWithCompletionBlock: ·½·¨£¬ÓÃÏÂÃæµÄʵÏÖÌæ»»Ëü£º

- (void)downloadPhotosWithCompletionBlock:(BatchPhotoDownloadingCompletionBlock)completionBlock
{
    // 1
    __block NSError *error;
    dispatch_group_t downloadGroup = dispatch_group_create(); 
 
    for (NSInteger i = 0; i < 3; i++) {
        NSURL *url;
        switch (i) {
            case 0:
                url = [NSURL URLWithString:kOverlyAttachedGirlfriendURLString];
                break;
            case 1:
                url = [NSURL URLWithString:kSuccessKidURLString];
                break;
            case 2:
                url = [NSURL URLWithString:kLotsOfFacesURLString];
                break;
            default:
                break;
        }
 
        dispatch_group_enter(downloadGroup); // 2
        Photo *photo = [[Photo alloc] initwithURL:url
                              withCompletionBlock:^(UIImage *image, NSError *_error) {
                                  if (_error) {
                                      error = _error;
                                  }
                                  dispatch_group_leave(downloadGroup); // 3
                              }];
 
        [[PhotoManager sharedManager] addPhoto:photo];
    }
 
    dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{ // 4
        if (completionBlock) {
            completionBlock(error);
        }
    });
}

ÏÂÃæ½âÊÍеÄÒì²½·½·¨ÈçºÎ¹¤×÷£º

ÔÚеÄʵÏÖÀÒòΪÄãûÓÐ×èÈûÖ÷Ị̈߳¬ËùÒÔÄã²¢²»ÐèÒª½«·½·¨°ü¹üÔÚ async µ÷ÓÃÖС£

ͬÑùµÄ enter ·½·¨£¬Ã»×öÈκÎÐ޸ġ£

ͬÑùµÄ leave ·½·¨£¬Ò²Ã»×öÈκÎÐ޸ġ£

dispatch_group_notify ÒÔÒì²½µÄ·½Ê½¹¤×÷¡£µ± Dispatch Group ÖÐûÓÐÈκÎÈÎÎñʱ£¬Ëü¾Í»áÖ´ÐÐÆä´úÂ룬ÄÇôcompletionBlock ±ã»áÔËÐС£Ä㻹ָ¶¨ÁËÔËÐÐ completionBlock µÄ¶ÓÁУ¬´Ë´¦£¬Ö÷¶ÓÁоÍÊÇÄãËùÐèÒªµÄ¡£

¶ÔÓÚÕâ¸öÌØ¶¨µÄ¹¤×÷£¬ÉÏÃæµÄ´¦ÀíÃ÷ÏÔ¸üÇåÎú£¬¶øÇÒÒ²²»»á×èÈûÈκÎÏ̡߳£

Ì«¶à²¢·¢´øÀ´µÄ·çÏÕ

¼ÈÈ»ÄãµÄ¹¤¾ßÏäÀïÓÐÁËÕâЩй¤¾ß£¬Äã´ó¸Å×öÈκÎÊÂÇé¶¼ÏëʹÓÃËüÃÇ£¬¶Ô°É£¿

¿´¿´ PhotoManager ÖÐµÄ downloadPhotosWithCompletionBlock ·½·¨¡£Äã¿ÉÄÜÒѾ­×¢Òâµ½ÕâÀïµÄ for Ñ­»·£¬Ëüµü´úÈý´Î£¬ÏÂÔØÈý¸ö²»Í¬µÄͼƬ¡£ÄãµÄÈÎÎñÊdz¢ÊÔÈà for Ñ­»·²¢·¢ÔËÐУ¬ÒÔÌá¸ßÆäËÙ¶È¡£

dispatch_apply ¸ÕºÃ¿ÉÓÃÓÚÕâ¸öÈÎÎñ¡£

dispatch_apply ±íÏֵþÍÏñÒ»¸ö for Ñ­»·£¬µ«ËüÄܲ¢·¢µØÖ´Ðв»Í¬µÄµü´ú¡£Õâ¸öº¯ÊýÊÇͬ²½µÄ£¬ËùÒÔºÍÆÕͨµÄ for Ñ­»·Ò»Ñù£¬ËüÖ»»áÔÚËùÓй¤×÷¶¼Íê³Éºó²Å»á·µ»Ø¡£

µ±ÔÚ Block ÄÚ¼ÆËãÈκθø¶¨ÊýÁ¿µÄ¹¤×÷µÄ×î¼Ñµü´úÊýÁ¿Ê±£¬±ØÐëҪСÐÄ£¬ÒòΪ¹ý¶àµÄµü´úºÍÿ¸öµü´úÖ»ÓÐÉÙÁ¿µÄ¹¤×÷»áµ¼Ö´óÁ¿¿ªÏúÒÔÖÂËüÄܵÖÏûÈκÎÒò²¢·¢´øÀ´µÄÊÕÒæ¡£¶ø±»³ÆÎª¿çԽʽ£¨striding£©µÄ¼¼Êõ¿ÉÒÔÔڴ˰ﵽÄ㣬¼´Í¨¹ýÔÚÿ¸öµü´úÀï¶à×ö¼¸¸ö²»Í¬µÄ¹¤×÷¡£

ÒëÕß×¢£º´ó¸Å¾ÍÄܼõÉÙ²¢·¢ÊýÁ¿°É£¬×÷ÕßÊÇÌáÐÑ´ó¼Ò×¢Òâ²¢·¢µÄ¿ªÏú£¬¼ÇÔÚÐÄÀ

ÄǺÎʱ²ÅÊʺÏÓà dispatch_apply ÄØ£¿

×Ô¶¨Òå´®ÐжÓÁУº´®ÐжÓÁлáÍêÈ«µÖÏû dispatch_apply µÄ¹¦ÄÜ£»Ä㻹²»ÈçÖ±½ÓʹÓÃÆÕͨµÄ for Ñ­»·¡£

Ö÷¶ÓÁУ¨´®ÐУ©£ºÓëÉÏÃæÒ»Ñù£¬ÔÚ´®ÐжÓÁÐÉϲ»ÊʺÏʹÓà dispatch_apply ¡£»¹ÊÇÓÃÆÕͨµÄ for Ñ­»·°É¡£

²¢·¢¶ÓÁУº¶ÔÓÚ²¢·¢Ñ­»·À´ËµÊǺܺÃÑ¡Ôñ£¬ÌرðÊǵ±ÄãÐèҪ׷×ÙÈÎÎñµÄ½ø¶Èʱ¡£

»Øµ½ downloadPhotosWithCompletionBlock: ²¢ÓÃÏÂÁÐʵÏÖÌæ»»Ëü

- (void)downloadPhotosWithCompletionBlock:(BatchPhotoDownloadingCompletionBlock)completionBlock
{
    __block NSError *error;
    dispatch_group_t downloadGroup = dispatch_group_create();
 
    dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
 
        NSURL *url;
        switch (i) {
            case 0:
                url = [NSURL URLWithString:kOverlyAttachedGirlfriendURLString];
                break;
            case 1:
                url = [NSURL URLWithString:kSuccessKidURLString];
                break;
            case 2:
                url = [NSURL URLWithString:kLotsOfFacesURLString];
                break;
            default:
                break;
        }
 
        dispatch_group_enter(downloadGroup);
        Photo *photo = [[Photo alloc] initwithURL:url
                              withCompletionBlock:^(UIImage *image, NSError *_error) {
                                  if (_error) {
                                      error = _error;
                                  }
                                  dispatch_group_leave(downloadGroup);
                              }];
 
        [[PhotoManager sharedManager] addPhoto:photo];
    });
 
    dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{
        if (completionBlock) {
            completionBlock(error);
        }
    });
}

ÄãµÄÑ­»·ÏÖÔÚÊDz¢ÐÐÔËÐеÄÁË£»ÔÚÉÏÃæµÄ´úÂëÖУ¬ÔÚµ÷Óà dispatch_apply ʱ£¬ÄãÓõÚÒ»´Î²ÎÊýÖ¸Ã÷Á˵ü´úµÄ´ÎÊý£¬Óõڶþ¸ö²ÎÊýÖ¸¶¨ÁËÈÎÎñÔËÐеĶÓÁУ¬¶øµÚÈý¸ö²ÎÊýÊÇÒ»¸ö Block¡£

ÒªÖªµÀËäÈ»ÄãÓдúÂë±£Ö¤Ìí¼ÓÏàÆ¬Ê±Ḭ̈߳²È«£¬µ«Í¼Æ¬µÄ˳ÐòÈ´¿ÉÄܲ»Í¬£¬ÕâÈ¡¾öÓÚÏß³ÌÍê³ÉµÄ˳Ðò¡£

±àÒë²¢ÔËÐУ¬È»ºó´Ó ¡°Le Internet¡± Ìí¼ÓһЩÕÕÆ¬¡£×¢Òâµ½Çø±ðÁËÂð£¿

ÔÚÕæ»úÉÏÔËÐÐдúÂë»áÉÔ΢¸ü¿ìµÄµÃµ½½á¹û¡£µ«ÎÒÃÇËù×öµÄÕâЩÌáËÙ¹¤×÷ÕæµÄÖµµÃÂð£¿

ʵ¼ÊÉÏ£¬ÔÚÕâ¸öÀý×ÓÀï²¢²»ÖµµÃ¡£ÏÂÃæÊÇÔ­Òò£º

1.Äã´´½¨²¢ÐÐÔËÐÐÏ̶߳ø¸¶³öµÄ¿ªÏú£¬ºÜ¿ÉÄܱÈÖ±½ÓʹÓà for Ñ­»·Òª¶à¡£ÈôÄãÒªÒÔºÏÊʵIJ½³¤µü´ú·Ç³£´óµÄ¼¯ºÏ£¬ÄDzÅÓ¦¸Ã¿¼ÂÇʹÓà dispatch_apply¡£

2.ÄãÓÃÓÚ´´½¨Ó¦ÓõÄʱ¼äÊÇÓÐÏ޵ġª¡ª³ý·ÇʵÔÚÌ«Ôã¸â·ñÔò²»ÒªÀË·Ñʱ¼äÈ¥ÌáǰÓÅ»¯´úÂë¡£Èç¹ûÄãÒªÓÅ»¯Ê²Ã´£¬ÄÇÈ¥ÓÅ»¯ÄÇЩÃ÷ÏÔÖµµÃÄ㸶³öʱ¼äµÄ²¿·Ö¡£Äã¿ÉÒÔͨ¹ýÔÚ Instruments Àï·ÖÎöÄãµÄÓ¦Óã¬ÕÒ³ö×ÔËÐÐʱ¼äµÄ·½·¨¡£¿´¿´ ÈçºÎÔÚ Xcode ÖÐʹÓà Instruments ¿ÉÒÔѧµ½¸ü¶àÏà¹ØÖªÊ¶¡£

3.ͨ³£Çé¿öÏ£¬ÓÅ»¯´úÂë»áÈÃÄãµÄ´úÂë¸ü¼Ó¸´ÔÓ£¬²»ÀûÓÚÄã×Ô¼ººÍÆäËû¿ª·¢ÕßÔĶÁ¡£ÇëÈ·±£Ìí¼ÓµÄ¸´ÔÓÐÔÄÜ»»À´×ã¹»¶àµÄºÃ´¦¡£

¼Çס£¬²»ÒªÔÚÓÅ»¯ÉÏÌ«·è¿ñ¡£ÄãÖ»»áÈÃÄã×Ô¼ººÍºóÀ´Õ߸üÄÑÒÔ¶Á¶®ÄãµÄ´úÂë¡£

GCD µÄÆäËûȤζ

µÈһϣ¡»¹Óиü¶à£¡ÓÐһЩ¶îÍâµÄº¯ÊýÔÚ²»Í¬µÄµÀ·ÉÏ×ߵøüÔ¶¡£ËäÈ»Äã²»»á̫Ƶ·±µØÊ¹ÓÃÕâЩ¹¤¾ß£¬µ«ÔÚ¶ÔµÄÇé¿öÏ£¬ËüÃÇ¿ÉÒÔÌṩ¼«´óµÄ°ïÖú¡£

×èÈû¡ª¡ªÕýÈ·µÄ·½Ê½

Õâ¿ÉÄÜÌýÆðÀ´ÏñÊǸö·è¿ñµÄÏë·¨£¬µ«ÄãÖªµÀ Xcode ÒÑÓÐÁ˲âÊÔ¹¦ÄÜÂð£¿:] ÎÒÖªµÀ£¬ËäÈ»ÓÐʱºòÎÒϲ»¶¼Ù×°Ëü²»´æÔÚ£¬µ«ÔÚ´úÂëÀï¹¹½¨¸´ÔÓ¹ØÏµÊ±±àдºÍÔËÐвâÊԷdz£ÖØÒª¡£

Xcode ÀïµÄ²âÊÔÔÚ XCTestCase µÄ×ÓÀàÉÏÖ´ÐУ¬²¢ÔËÐÐÈκη½·¨Ç©ÃûÒÔ test ¿ªÍ·µÄ·½·¨¡£²âÊÔÔÚÖ÷Ïß³ÌÔËÐУ¬ËùÒÔÄã¿ÉÒÔ¼ÙÉèËùÓвâÊÔ¶¼ÊÇ´®Ðз¢ÉúµÄ¡£

µ±Ò»¸ö¸ø¶¨µÄ²âÊÔ·½·¨ÔËÐÐÍê³É£¬XCTest ·½·¨½«¿¼ÂǴ˲âÊÔÒѽáÊø£¬²¢½øÈëÏÂÒ»¸ö²âÊÔ¡£ÕâÒâζ×ÅÈκÎÀ´×Ôǰһ¸ö²âÊÔµÄÒì²½´úÂë»áÔÚÏÂÒ»¸ö²âÊÔÔËÐÐʱ¼ÌÐøÔËÐС£

ÍøÂç´úÂëͨ³£ÊÇÒì²½µÄ£¬Òò´ËÄã²»ÄÜÔÚÖ´ÐÐÍøÂç»ñȡʱ×èÈûÖ÷Ï̡߳£Ò²¾ÍÊÇ˵£¬Õû¸ö²âÊÔ»áÔÚ²âÊÔ·½·¨Íê³ÉÖ®ºó½áÊø£¬Õâ»áÈöÔÍøÂç´úÂëµÄ²âÊÔ±äµÃºÜÀ§ÄÑ¡£Ò²¾ÍÊÇ£¬³ý·ÇÄãÔÚ²âÊÔ·½·¨ÄÚ²¿×èÈûÖ÷Ïß³ÌÖ±µ½ÍøÂç´úÂëÍê³É¡£

×¢Ò⣺ÓÐһЩÈË»á˵£¬ÕâÖÖÀàÐ͵IJâÊÔ²»ÊôÓÚ¼¯³É²âÊÔµÄÊ×Ñ¡¼¯£¨Preferred Set£©¡£Ò»Ð©ÈË»áÔÞͬ£¬Ò»Ð©È˲»»á¡£µ«Èç¹ûÄãÏë×ö£¬ÄǾÍÈ¥×ö¡£

µ¼º½µ½ GooglyPuffTests.m ²¢²é¿´ downloadImageURLWithString:£¬ÈçÏ£º

- (void)downloadImageURLWithString:(NSString *)URLString
{
    NSURL *url = [NSURL URLWithString:URLString];
    __block BOOL isFinishedDownloading = NO;
    __unused Photo *photo = [[Photo alloc]
                             initwithURL:url
                             withCompletionBlock:^(UIImage *image, NSError *error) {
                                 if (error) {
                                     XCTFail(@"%@ failed. %@", URLString, error);
                                 }
                                 isFinishedDownloading = YES;
                             }];
 
    while (!isFinishedDownloading) {}
}

ÕâÊÇÒ»ÖÖ²âÊÔÒì²½ÍøÂç´úÂëµÄÓ×ÖÉ·½Ê½¡£ While Ñ­»·ÔÚº¯ÊýµÄ×îºóÒ»Ö±µÈ´ý£¬Ö±µ½ isFinishedDownloading ²¼¶ûÖµ±ä³É True£¬ËüÖ»»áÔÚ Completion Block Àï·¢Éú¡£ÈÃÎÒÃÇ¿´¿´ÕâÑù×öÓÐʲôӰÏì¡£

ͨ¹ýÔÚ Xcode Öеã»÷ Product / Test ÔËÐÐÄãµÄ²âÊÔ£¬Èç¹ûÄãʹÓÃĬÈϵļü°ó¶¨£¬Ò²¿ÉÒÔʹÓÿì½Ý¼ü ?+U À´ÔËÐÐÄãµÄ²âÊÔ¡£

ÔÚ²âÊÔÔËÐÐʱ£¬×¢Òâ Xcode debug µ¼º½À¸ÀïµÄ CPU ʹÓÃÂÊ¡£Õâ¸öÉè¼Æ²»µ±µÄʵÏÖ¾ÍÊÇÒ»¸ö»ù±¾µÄ ×ÔÐýËø ¡£ËüºÜ²»ÊµÓã¬ÒòΪÄãÔÚ While Ñ­»·ÀïÀË·ÑÁËÕä¹óµÄ CPU ÖÜÆÚ£»¶øÇÒËüÒ²¼¸ºõûÓÐÀ©Õ¹ÐÔ¡£

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

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ