첫 번째 앱을 제작 중이며 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];
}
이 현재 트랙이 재생되는 동안 재생 및 다음 곡을 가져 오기 위해 시도하고있어 어떻게 새로운 것이므로 코드가 꽤 복잡하고 누구나 개선 할 수있는 방법을 지적 할 수 있으면 고맙겠습니다.
올바른 방향을 알려 주셔서 감사합니다!
그들은 아마도 당신이 들었던 마지막 10 ~ 20 곡을 캐싱하고있을 것입니다. – idbehold
흠. 자신의 네이티브 애플 리케이션을 사용하면, 노래 다운로드 진행률 표시 줄이 0-100에서 초 미만, 내가 실제로 다운로드되는 노래로 걸릴 참조하십시오 ....하지만 노래를 캐싱 하나의 옵션이 될 것 같아요. 따르다. 그러나 그것은 내가하고있는 일에 대해 지나치게 비싸게 보입니다./감사합니다. –
노래를 건너 뛸 때 빨리 듣는 지 아닌지 알 수없는 앨범/재생 목록을 재생하려고 시도하면 이론을 테스트 할 수 있습니다. – idbehold