2016-11-11 2 views
0

내 모든 작업이 잘 진행되고 있지만 약간의 문제가 있습니다. 내 NSURLRequest - (void) viewDidLoad {}가 있고 서버에서 데이터를 가져 오는 데 약간의 시간이 걸렸습니다. 나는 그것이 비동기 방식으로 수행되기를 원한다.Objective-C에서 API 데이터를 비동기 적으로 가져 오는 방법은 무엇입니까?

다음은 제 코드입니다. 어떻게 구현해야합니까? 미리 감사드립니다. :)

- (void)viewDidLoad { 
[super viewDidLoad]; 
[[self tableView2]setDelegate:self ]; 
[[self tableView2]setDataSource:self]; 
array=[[NSMutableArray alloc]init]; 

NSString *castString = [NSString stringWithFormat:@"https://api.themoviedb.org/3/movie/%@/credits?api_key=c4bd81709e87b12e6c74a08609433c49",movieIDinString]; 
NSURL *url=[NSURL URLWithString:castString]; 

NSURLRequest *request=[NSURLRequest requestWithURL:url]; 
connection=[NSURLConnection connectionWithRequest:request delegate:self]; 
if (connection) 
{ 
    webData= [[NSMutableData alloc]init]; 
} 
+0

dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)^(공극) {// 배경 스레드 dispatch_async (dispatch_get_main_queue()^(공극) {// 실행 UI 업데이트 [_activityIndicatorImageView stopAnimating]; }), }); –

+0

@SudheerKolasani 당신이 설명해 주시겠습니까 Objective-C의 초보자 인 –

+0

은 백그라운드에서 URL을로드하고 메인 스레드에서 tableview를 다시로드하는 것만으로 간단합니다 –

답변

1

이 시도 ..

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
     //Background Thread 

     NSString *castString = [NSString stringWithFormat:@"https://api.themoviedb.org/3/movie/%@/credits?api_key=c4bd81709e87b12e6c74a08609433c49",movieIDinString]; 
     NSURL *url=[NSURL URLWithString:castString]; 

     NSURLRequest *request=[NSURLRequest requestWithURL:url]; 
     connection=[NSURLConnection connectionWithRequest:request delegate:self]; 
     if (connection) 
     { 
      webData= [[NSMutableData alloc]init]; 
     } 

     dispatch_async(dispatch_get_main_queue(), ^(void){ 
      //Run UI Updates 

// reload table view here 
      [_activityIndicatorImageView stopAnimating]; 
     }); 
    }); 
+0

viewDidLoad에서 수행해야합니까? –

1

당신이 API를 사용하는 경우 서버에서 데이터를 가져 오기 위해, 시간이 좀 걸릴 것입니다. 이 때, 백그라운드 스레드를 사용하고 주 스레드에서 활동 표시기를 표시해야합니다. API에서 데이터를 가져온 후 스레드를 기본 스레드로 변경해야합니다. 내 아래 코드를 확인하십시오.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    // background thread 
    // code for API call 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // main thread 
    }); 
}); 

콜백 메소드도 사용할 수 있습니다.

[helperApi instaUserDetails:finderDetailsDataDict andCallback:^(id jsonResponse) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if ([[jsonResponse objectForKey:@"code"] intValue] == 200) { 

       userDetailsDict = [jsonResponse objectForKey:@"data"]; 

       mediaArray = [[[[jsonResponse objectForKey:@"data"] objectForKey:@"user"] objectForKey:@"media"] objectForKey:@"nodes"]; 
      } 
      [activityIndicator stopAnimating]; 
      [self createUI]; 
     }); 
    }]; 

NSURLConnection은 더 이상 사용되지 않습니다. NSURLSession을 사용해보십시오.

0

시도 AFNeworking. 완료 블록과 함께 비동기 다운로드/업로드를위한 몇 가지 옵션을 제공합니다.

관련 문제