-1

次のエラーが表示されます

    [__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x75a8e20
    2013-04-20 08:56:14.90 MyApp[407:c07] *** Terminating app due to uncaught 
    exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: 
    unrecognized selector sent to instance 0x75a8e20'

これは、JSON を扱う最初の作業です。URL が flickr の URL である最初のコードを実行しようとすると、上記のエラーが発生します。写真をキーとして使用すると、配列が印刷され、アプリが突然終了します。

#define flickrPhotoURL [NSURL URLWithString: @"http://api.flickr.com/services/rest/?format=json&sort=random&method=flickr.photos.search&tags=rocket&tag_mode=all&api_key=12345&nojsoncallback=1"]

- (void)viewDidLoad
{
   [super viewDidLoad];
   //this line of code will be executed in the background to download the contents of the flickr URL
   dispatch_async(flickrBgQueue, ^{
   NSData* flickrData = [NSData dataWithContentsOfURL:flickrPhotoURL]; //NOTE: synchronous method...But we actually need to implement asynchronous method
   [self performSelectorOnMainThread:@selector(appFetchedData:) withObject:flickrData waitUntilDone:YES]; //when data is available "appFetchedData" method will be called
});

}

- (void)appFetchedData: (NSData *)responseData 
{
 //parsing JSON data
 NSError *error_parsing;
 NSDictionary *flickr_json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error_parsing];
 NSArray* photo_information = [flickr_json objectForKey:@"photos"];

 NSLog(@"Photo Information: %@",photo_information);

 NSDictionary* photo = (NSDictionary*)[photo_information objectAtIndex:0];

 humanReadable.text = [NSString stringWithFormat:@"Owner is %@",[photo objectForKey:@"Owner"]];
}

ただし、キー「写真」を「ローン」に置き換えて同じコードを実行し、次の URL とコードを使用すると、

#define flickrPhotoURL [NSURL URLWithString: @"http://api.kivaws.org/v1/loans/search.json?status=fundraising"]


- (void)appFetchedData: (NSData *)responseData 
{
 //parsing JSON data
 NSError *error_parsing;
 NSDictionary *flickr_json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error_parsing];
 NSArray* photo_information = [flickr_json objectForKey:@"loans"];

 NSLog(@"Photo Information: %@",photo_information);

 NSDictionary* photo = (NSDictionary*)[photo_information objectAtIndex:0];

 humanReadable.text = [NSString stringWithFormat:@"loan amount is %@",[photo objectForKey:@"loan_amount"]];

}

、アプリは humanredable.text プロパティに正しい情報を設定します。最初の JSON に間違ったキーを使用していませんか?

4

1 に答える 1

2

まず、Flickr API キーをそのまま公開していただきありがとうございます。いつの日か個人情報の盗難を実行できれば、非常に便利です。

次に、返されたデータを読まなかったことに感謝します。次のように始まります。

{"photos":{"page":1, "pages":1792, "perpage":100,
 ^^^^^^^^^^

したがって、キーのオブジェクトはphotos配列ではなく辞書です。したがって、

NSArray* photo_information = [flickr_json objectForKey:@"photos"];

間違っている。代わりにこれを意味しましたか:

NSArray* photo_information = [[flickr_json objectForKey:@"photos"]
                               objectForKey:@"photo"];

? また、以下では、人間が読める説明を作成するときに、

[photo objectForKey:@"Owner"]

間違っている、そうあるべきだ

[photo objectForKey:@"owner"]

代わりは。

于 2013-04-20T14:33:58.633 に答える