2015-02-01 7 views
0

첫 번째 앱을 제작 중이며 Soundcloud 클라이언트입니다. 지금 당장 트랙이 재생되도록 선택 될 때마다 바이너리 데이터를 가져 오기 위해 NSURLSessionDataTask를 가져와야하지만 오랜 시간이 걸립니다. 그리고 다음 곡으로 건너 뛸 때 현재 노래가 재생 될 때 다음 곡을 다운로드하기 위해 논리를 추가해야합니다 ... 그러나 사용자가 빨리 건너 뛴다면 여전히 느립니다 :/Soundcloud 앱이 다음 트랙으로 빨리 건너 뛰는 방법은 무엇입니까?

Soundcloud 기본 앱이 즉시 건너 뜁니다. 어떻게 작동합니까? Soundcloud iOS SDK를 사용해 보았지만 이제는 더 이상 사용되지 않습니다. 여기

내 노래가 가져올된다 또한

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
self.selectedTrack = self.SCTrackList[indexPath.row]; 
self.selectedTrackRow = indexPath.row; 

[[SoundCloudAPI sharedInstance]fetchTrack:self.selectedTrack completionHandler:^(NSData *trackData, NSString *error) { 
    self.player = [[AVAudioPlayer alloc]initWithData: trackData error:nil]; 
    [self.player prepareToPlay]; 
    [self.player play];; 

}]; 
[self prepareForNextTrack:self.selectedTrack]; 
} 

-(void)prepareForNextTrack: (SCTrack*)trackPlaying { 
self.selectedTrackRow += 1; 
self.selectedTrack = self.SCTrackList[self.selectedTrackRow]; 

[[SoundCloudAPI sharedInstance]fetchTrack:self.selectedTrack completionHandler:^(NSData *trackData, NSString *error) { 
    self.trackDataToPlay = trackData; 
}]; 
} 


- (IBAction)nextPressed:(id)sender { 

self.player = [[AVAudioPlayer alloc]initWithData: self.trackDataToPlay error:nil]; 
[self.player prepareToPlay]; 
[self.player play];; 

[self prepareForNextTrack:self.selectedTrack]; 
} 

, 난 :

-(void)fetchTrack: (SCTrack*)selectedTrack completionHandler: (void(^)(NSData *trackData, NSString *error)) completionHandler; { 
NSString* clientID = @"41a5278fd8c704c3eb5a4a0ca38f9036"; 
NSString* streamURL = selectedTrack.stream_url; 
NSString* urlString = [NSString stringWithFormat:@"%@?client_id=%@", streamURL, clientID]; 
NSURL* url = [[NSURL alloc]initWithString:urlString]; 

NSLog(@"%@", urlString); 

NSMutableURLRequest* request = [[NSMutableURLRequest alloc]initWithURL:url]; 
request.HTTPMethod = @"GET"; 

NSURLSessionDataTask* dataTask = [[self session] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    NSHTTPURLResponse* callResponse = (NSHTTPURLResponse*)response; 
    if ([callResponse isKindOfClass:[NSHTTPURLResponse class]]) { 

     NSInteger responseCode = [callResponse statusCode]; 
     if (responseCode >= 200 && responseCode <= 299) { 

      NSData* trackData = data; 

      NSLog(@"STREAM 200"); 
      [[NSOperationQueue mainQueue]addOperationWithBlock:^{ 
       NSLog(@"%@", data); 
       completionHandler(trackData, nil); 
      }]; 
     }else{ 
      NSLog(@"%ld", (long)responseCode); 
     } 
    } 
}]; 

[dataTask resume]; 
} 

이 현재 트랙이 재생되는 동안 재생 및 다음 곡을 가져 오기 위해 시도하고있어 어떻게 새로운 것이므로 코드가 꽤 복잡하고 누구나 개선 할 수있는 방법을 지적 할 수 있으면 고맙겠습니다.

올바른 방향을 알려 주셔서 감사합니다!

+0

그들은 아마도 당신이 들었던 마지막 10 ~ 20 곡을 캐싱하고있을 것입니다. – idbehold

+0

흠. 자신의 네이티브 애플 리케이션을 사용하면, 노래 다운로드 진행률 표시 줄이 0-100에서 초 미만, 내가 실제로 다운로드되는 노래로 걸릴 참조하십시오 ....하지만 노래를 캐싱 하나의 옵션이 될 것 같아요. 따르다. 그러나 그것은 내가하고있는 일에 대해 지나치게 비싸게 보입니다./감사합니다. –

+0

노래를 건너 뛸 때 빨리 듣는 지 아닌지 알 수없는 앨범/재생 목록을 재생하려고 시도하면 이론을 테스트 할 수 있습니다. – idbehold

답변

0

그래서 내가 생각했던 것보다 더 복잡한 방법이 만들어졌습니다. 내가해야만하는 것은 tokenWithContentsOfURL 메서드가 토큰을 전달하는 노래를 검색하는 것이다.

NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?oauth_token=%@",self.selectedTrack.stream_url, self.token]]]; 

물론 AVAudioPlayer에 데이터를 넣으십시오.

기본적으로 위의 fetchTrack 기능을 제거합니다.