2014-02-17 69 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。

然而,如果我使用鬆1作爲參數,它失敗,錯誤

終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,原因:「 - [S3ObjectSummary stringWithURLEncoding]:無法識別的選擇發送到實例0x175aef30

當我使用的NSLog,既鬆1和song2打印完全相同的字符串「說唱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 

要解決這個問題,我發現其中介紹瞭如何從該對象與屬性「說明」獲得的NSString值S3ObjectSummary的文檔。 [S3ObjectSummary說明]

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

所以你的情況NSString的是song1.description

把這一切在一起你會得到如下。編碼目的

入住此link

//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編碼。

此外,你應該這樣嘗試從數組元素構造一個字符串。

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