私は初心者のxcodeプログラマーです。
Flickr Json を使用して collectionview を表示するためのチュートリアルを読みました。ここに2つのリンクがあります:http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12
と
http://www.raywenderlich.com/22417/beginning-uicollectionview-in-ios-6-part-22
しかし今は、XML のみを表示するサイト、Danbooru のコレクションビューを作成したいと考えています。
上記のチュートリアルでは、作成者が作成した 4 つのファイル (Flickr.h、Flickr.m、FlickrPhoto.h、FlickrPhoto.m) を使用しています。
私は Flickr.m ファイルがそのアプリの重要な役割を果たしていると思うので、そのコードを引用します:
#import "Flickr.h"
#import "FlickrPhoto.h"
#define kFlickrAPIKey @"d02c877c0a4220890f14fc95f8b16983"
@implementation Flickr
+ (NSString *)flickrSearchURLForSearchTerm:(NSString *) searchTerm
{
searchTerm = [searchTerm stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return [NSString stringWithFormat:@"http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=%@&text=%@&per_page=20&format=json&nojsoncallback=1",kFlickrAPIKey,searchTerm];
}
+ (NSString *)flickrPhotoURLForFlickrPhoto:(FlickrPhoto *) flickrPhoto size:(NSString *) size
{
if(!size)
{
size = @"m";
}
return [NSString stringWithFormat:@"http://farm%d.staticflickr.com/%d/%lld_%@_%@.jpg",flickrPhoto.farm,flickrPhoto.server,flickrPhoto.photoID,flickrPhoto.secret,size];
}
- (void)searchFlickrForTerm:(NSString *) term completionBlock:(FlickrSearchCompletionBlock) completionBlock
{
NSString *searchURL = [Flickr flickrSearchURLForSearchTerm:term];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSError *error = nil;
NSString *searchResultString = [NSString stringWithContentsOfURL:[NSURL URLWithString:searchURL]
encoding:NSUTF8StringEncoding
error:&error];
if (error != nil) {
completionBlock(term,nil,error);
}
else
{
// Parse the JSON Response
NSData *jsonData = [searchResultString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *searchResultsDict = [NSJSONSerialization JSONObjectWithData:jsonData
options:kNilOptions
error:&error];
if(error != nil)
{
completionBlock(term,nil,error);
}
else
{
NSString * status = searchResultsDict[@"stat"];
if ([status isEqualToString:@"fail"]) {
NSError * error = [[NSError alloc] initWithDomain:@"FlickrSearch" code:0 userInfo:@{NSLocalizedFailureReasonErrorKey: searchResultsDict[@"message"]}];
completionBlock(term, nil, error);
} else {
NSArray *objPhotos = searchResultsDict[@"photos"][@"photo"];
NSMutableArray *flickrPhotos = [@[] mutableCopy];
for(NSMutableDictionary *objPhoto in objPhotos)
{
FlickrPhoto *photo = [[FlickrPhoto alloc] init];
photo.farm = [objPhoto[@"farm"] intValue];
photo.server = [objPhoto[@"server"] intValue];
photo.secret = objPhoto[@"secret"];
photo.photoID = [objPhoto[@"id"] longLongValue];
NSString *searchURL = [Flickr flickrPhotoURLForFlickrPhoto:photo size:@"m"];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]
options:0
error:&error];
UIImage *image = [UIImage imageWithData:imageData];
photo.thumbnail = image;
[flickrPhotos addObject:photo];
}
completionBlock(term,flickrPhotos,nil);
}
}
}
});
}
+ (void)loadImageForPhoto:(FlickrPhoto *)flickrPhoto thumbnail:(BOOL)thumbnail completionBlock:(FlickrPhotoCompletionBlock) completionBlock
{
NSString *size = thumbnail ? @"m" : @"b";
NSString *searchURL = [Flickr flickrPhotoURLForFlickrPhoto:flickrPhoto size:size];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSError *error = nil;
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]
options:0
error:&error];
if(error)
{
completionBlock(nil,error);
}
else
{
UIImage *image = [UIImage imageWithData:imageData];
if([size isEqualToString:@"m"])
{
flickrPhoto.thumbnail = image;
}
else
{
flickrPhoto.largeImage = image;
}
completionBlock(image,nil);
}
});
}
@end
それがJsonのコードで、検索するとTBXML(opensource)でXMLを解析する方法を見つけました
以下のコードを別のテスト プロジェクトの viewController に実装すると、デバッグ画面に表示される画像の URL を確認できました。
void (^tbxmlSuccessBlock)(TBXML *) = ^(TBXML * tbxml){
TBXMLElement *elemRoot = nil, *elemImage = nil ;
elemRoot = tbxml.rootXMLElement;
if(elemRoot){
elemImage = [TBXML childElementNamed:@"post" parentElement:elemRoot];
while(elemImage){{
NSString *localURL = [TBXML valueOfAttributeNamed:@"file_url" forElement:elemImage];
NSLog(@"Local : %@", localURL);
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:localURL]];
UIImage *image = [UIImage imageWithData:imageData];
weatherPhoto.largeImage = image;
elemImage=elemImage->nextSibling;
}}
}};
void (^tbxmlFailureBlock) (TBXML *, NSError *) = ^(TBXML * tbxml, NSError * error){
NSLog(@"Error: %@", error);
};
- (void)parseXML{
NSURL *imageURL = [NSURL URLWithString:@"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=5"];
[TBXML newTBXMLWithURL:imageURL success:tbxmlSuccessBlock failure:tbxmlFailureBlock];}
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
[NSThread detachNewThreadSelector:@selector(parseXML) toTarget:self withObject:nil];
}
これまでのところ、私が得たものはこれだけです.URLテキストを取得しています. Flickr.m を変更して XML から画像を作成し、UIcollectionView に表示するにはどうすればよいですか?