2014-07-22 3 views
0

내 응용 프로그램은 서버에서 이미지를로드합니다. 캐싱을 위해 SDWebImage를 사용합니다. 이미지를 표시하려고하면 이미지가 이미 캐시되지 않은 경우 자리 표시 자 이미지가 표시되므로 캐시되지 않은 경우 대기하게됩니다.매개 변수가있는 지연 재귀 메서드 호출

- (void)photoPagesController:(EBPhotoPagesController *)controller 
      imageAtIndex:(NSInteger)index 
     completionHandler:(void (^)(UIImage *))handler 
{ 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 

     MyPhoto *photo = self.photos[index]; 

     [self.manager cachedImageExistsForURL:photo.url completion:^(BOOL isInCache) { 

      if (isInCache) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        handler(photo.imageView.image); 
       }); 
      } 
      else { 
       // Wait 1 second and then call 
       // photoPagesController:imageAtIndex:completionHandler recursively. 
      } 
     }]; 
    });  

은}

어떻게 재귀 호출 후 어느 정도 시간을 기다려야 할 수 있을까? 더 나은 구현 방법이 있습니까?

답변

1

사용 dispatch_after 그것은 당신이 그것을 N 번 이상 호출 할 어떻게 방지 할 : 일,

- (void)photoPagesController:(EBPhotoPagesController *)controller 
      imageAtIndex:(NSInteger)index 
     completionHandler:(void (^)(UIImage *))handler 
{ 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 

     MyPhoto *photo = self.photos[index]; 

     [self.manager cachedImageExistsForURL:photo.url completion:^(BOOL isInCache) { 

      if (isInCache) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        handler(photo.imageView.image); 
       }); 
      } 
      else { 
       // Wait 1 second and then call 
       // photoPagesController:imageAtIndex:completionHandler recursively. 
       double delayInSeconds = 1.0; //Give the delay you want 
       dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
       dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
       //This will called after 1 seconds 
       [self photoPagesController:controller 
        imageAtIndex:index 
        completionHandler:handler]; 


       }); 
      } 
     }]; 
    }); 
} 
+0

감사를 시도? – zontragon

+0

이 코드는 네트워크 조건에 따라 달라집니다. 간단한 해결책은'- (void) photoPagesController : (EBPhotoPagesController *) 컨트롤러 imageAtIndex : (NSInteger) index.Make 조건과 같은 함수에 인수를 추가하는 것입니다. whiterver want completionHandler : (void (^) (UIImage *)) 핸들러 numberCall : (NSInteger) callNo'는 callNo를 0보다 먼저 전달하고 블록에서 callNo를 증가시킵니다. – codester

관련 문제