2012-12-20 1 views
0

YouTube API를 사용하여 일부 동영상을 매우 간단하게 가져 와서 iPhone 앱의 UITableView에 표시하지만 동영상을 가져올 때 테이블이 일시적으로 멈 춥니 다.YouTube API 가져 오기 일시적으로 UITableView가 일시적으로 흔들림

아래의 코드를 호출하여 다음 25 개의 비디오를 가져올 수 있지만 멋지게 작동하지만 가져 오기 프로세스 중에 UITableView가 정지하면 몇 초 후에 가져 오기가 다시 시작됩니다. 이걸 어떻게 막을 수 있는지에 대한 아이디어가 있습니까?

NSURL *url = [[[feeds lastObject] nextLink] URL]; 
     GDataQueryYouTube* query = [GDataQueryYouTube youTubeQueryWithFeedURL:url]; 
     ticket = [service fetchFeedWithQuery:query delegate:self didFinishSelector:@selector(requestAdditional:finishedWithFeed:error:)]; 



- (void)requestAdditional:(GDataServiceTicket *)ticket finishedWithFeed:(GDataFeedBase *)aFeed error:(NSError *)error 
{ 
    [feeds addObject:aFeed]; 

    NSArray *newEntries = [aFeed entries]; 

    for (GDataEntryBase *entry in newEntries) 
    { 
     [entry setParent:nil]; 
     [feed addEntry:entry]; 
    } 

    [self fetchVideoData]; 

    [self dismissViewControllerAnimated:YES completion:^{}]; 

    [self.tableView reloadData]; 
} 

편집 : 나는 [self fetchVideoData];를 호출 할 때

내가 느린 다운 원인이 무엇 생각이다. 이 메서드에서는 데이터, 비디오 타이틀, 뷰 카운트, 축소판 등 모든 다른 비트를 가져 오는 다른 메서드를 많이 호출합니다.

GCD 메서드의 첫 번째 섹션 안에이 메서드를 배치 한 다음 추가했습니다. 내 이미지를 내 배열에 후자 부분에 있지만 내 배열 그냥 비어 나오는.

다음은 썸네일을 가져 오는 특히 느린 방법의 예입니다. 나는 이것을 보았지만 시도했지만 GCD 방법을 적용하지 못했고,이 상황에서 적용하는 추가 도움을 주시면 감사하겠습니다.

-(void)setThumbnailsArray 
{ 
    for (int i = 0; i < [[feed entries] count]; i++) 
    { 
     GDataEntryBase *entry = [[feed entries] objectAtIndex:i]; 
     NSArray *thumbnails = [[(GDataEntryYouTubeVideo *)entry mediaGroup] mediaThumbnails]; 
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[thumbnails objectAtIndex:1] URLString]]]; 
     UIImage *image = [UIImage imageWithData:data]; 

     //No thumbnail, create placeholder using avatar 
     if (image == nil) 
     { 
      UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 110, 64)]; 
      [view setBackgroundColor:[UIColor whiteColor]]; 
      UIImageView *avatar = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@Avatar.png", memberName]]]; 
      [avatar setFrame:CGRectMake(0, 0, avatar.frame.size.width - 10, avatar.frame.size.height - 10)]; 
      avatar.center = view.center; 
      [view addSubview:avatar]; 

      //Create UIImage from the view with the avatar 
      UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
      [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
      UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      image = img; 
     } 

     [feedThumbnails addObject:image]; 
    } 
} 

답변

0

youtube에 전화를 걸고 있습니까? 그렇다면이 호출이 실행되는 동안 UI가 응답하지 않게됩니다.

일반적으로 주 스레드에서 시간 집약적 인 작업을 수행하고 싶지는 않습니다. Grand Central Dispatch를 사용하면 다음과 같이 보일 것입니다 :

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //Time consuming operations go here 

    //When finished call back on the main thread: 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //Return results and update data back on main thread 
    }); 
}); 
+0

아, 이제 이것을 사용하기위한 몇 가지 권장 사항을 보았습니다. 그러나 작동시키지 못했습니다. 나는 내 질문을 업데이트했다. 아마도 당신은 엿봄, 감사 할 수 있었다. –

+0

타이밍 문제 일 가능성이 높습니다. 여기서도 알림을 사용하는 방법을 고려해 볼 수 있습니다. 무슨 일이 일어나고 있는지 추측하고 있는데, 작업 쓰레드는 [self fetchVideoData] 호출로 분리됩니다. 주 스레드가 작업 스레드가 처리를 완료하기 전에 '새'배열을 잡으려고 시도합니다. 간단한 통지 체계를 구현하는 방법은 http://stackoverflow.com/questions/13954003/reload-uitableview-from-another-tab/13955779#13955779에서 작성한 답변을 확인하십시오. – mElling

0

인스트루먼트의 타임 프로파일레이터로 어플리케이션을 프로파일하고 동결 중에 어떤 일이 일어나는지 확인하십시오. 코드는 차단할 것으로 보이지 않는 것처럼 보입니다.

관련 문제