2014-02-17 4 views
0

Я вытаскиваю массив имен песен с моего сервера AWS.NSString не работает как параметр, но буквальная строка работает?

Следующим шагом будет использование одного из этих имен песен в качестве параметра в запросе на получение его потокового URL.

//[1] Initialize the S3 Client. 
    self.s3 = [[AmazonS3Client alloc] initWithAccessKey:@"blah" withSecretKey:@"blah"]; 
    self.s3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2]; 



    //[2] Get an array of song names 
    NSArray *song_array = [self.s3 listObjectsInBucket:@"blahblah"]; 
    NSLog(@"the objects are %@", song_array); 


    //[3] Get a single song name from the array 
    NSString *song1 = [[NSString alloc] init]; 
    song1 = (NSString *)[song_array objectAtIndex:1]; 
    NSLog(@"%@", song1); 

    NSString * song2 = @"Rap God.mp3"; 
    NSLog(@"%@", song2); 


    //[4] Get the Song URL 
    S3GetPreSignedURLRequest *gpsur = [[S3GetPreSignedURLRequest alloc] init]; 
    gpsur.key      = song2; 
    gpsur.bucket     [email protected]"soundshark"; 
    gpsur.expires     = [NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval) 3600]; 
    NSError *error; 
    NSURL *url = [self.s3 getPreSignedURL:gpsur error:&error]; 
    NSLog(@"the url is %@", url); 

Song2 отлично работает как параметр gpsur.key.

Однако, если я использую SONG1 в качестве параметра, он терпит неудачу с ошибкой

согласующего приложением из-за неперехваченное исключение «NSInvalidArgumentException», причина: «- [S3ObjectSummary stringWithURLEncoding]: непризнанный селектор направлен например 0x175aef30

Когда я использую NSLog, как SONG1 и song2 печатать точно такую ​​же строку "Rap God.mp3"

Почему ошибка? Почему я не могу просто использовать строку из массива? Он имеет то же значение?

ответ

1

Изменить

NSString *song1 = [[NSString alloc] init]; 
song1 = (NSString *)[song_array objectAtIndex:1]; 
NSLog(@"%@", song1); 

в

S3ObjectSummary *s3object = [song_array objectAtIndex:1]; 
NSString *song1 = [s3object description]; 
NSLog(@"%@", song1); 

Если он будет работать, это будет лучше изменить

NSString *song1 = [s3object description]; 

в

NSString *song1 = [s3object etag]; 

или

NSString *song1 = [s3object key]; 

Я не знаком с S3ObjectSummary, так что я не могу предложить какой вариант лучше.

+0

Я люблю тебя ...... – user1161310

1

Проблема в том, что «song1» на самом деле не является NSString. Следующее означает, что вы пытаетесь вызвать метод для объекта класса S3SObjectSummary, который не существует. Это говорит вам, что «song1» - это S3SObjectSummary, а не NSString.

'-[S3ObjectSummary stringWithURLEncoding]: unrecognized selector sent to instance 

Чтобы устранить эту проблему, я нашел в документации по S3ObjectSummary, который описывает, как получить значение NSString из этого объекта с «описанием» собственности. [Описание S3ObjectSummary]

http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/S3ObjectSummary.html#//api/name/description

Так что в вашем случае NSString будет song1.description

Чтобы поместить это все вместе, вы получите следующее.

//Grab the S3ObjectSummary from the array 
    S3ObjectSummary *song1 = (S3ObjectSummary*)[song_array objectAtIndex:1]; 
    NSLog(@"%@", song1); 

// Use the description property of S3ObjectSummary to get the string value. 
    NSString *stringFromObjectSummary = song1.description; 


    S3GetPreSignedURLRequest *gpsur = [[S3GetPreSignedURLRequest alloc] init]; 
    gpsur.key      = stringFromObjectSummary; 
0

На первый взгляд, вы должны использовать stringByAddingPercentEscapesUsingEncoding для кодирования недопустимых символов в URL:

Установите этот флажок link для кодирования цели.

Кроме того, вы должны попробовать как это построить строку из элемента массива.

NSString *song1 = [NString stringWithFormat:@"%@", [song_array objectAtIndex:1]]; 
NSLog(@"%@", song1); 
Смежные вопросы