0

私は4つの画面を備えたiOSでアプリケーションを作成しており、そのうちの1つはフォトギャラリーとして機能したいと考えています。グラフを使用してFacebookページからダウンロードしたこの画像。viewDidLoad メソッドの ViewController クラスで、接続 URL を作成します。

(void)viewDidLoad
{
  [super viewDidLoad];  
  NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/NBAStoreNYC/photos"];  
  NSURL *url = [NSURL URLWithString:urlString];  

  // Create NSURLRequest
  NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];  

 //Create conection
 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];  

 if (connection) 
 {  
    NSLog(@"Connecting...");   
    dataJSON = [[NSMutableData alloc] init];  
 } 
 else 
 {    
    NSLog(@"ERROR: Unable to create connection.");  
 }
}

画像をダウンロードするために、返された JSON を解析しました。それぞれの for..end で画像の URL を取得します。

-(void)connection:(NSURLConnection )connection didFailWithError:(NSError )error{ NSLog(@"Error: %@", [error localizedDescription]); }

-(void)connection:(NSURLConnection )connection didReceiveResponse:(NSURLResponse )response{ NSLog(@"Received response: %@", response); [dataJSON setLength:0]; }

-(void)connection:(NSURLConnection )connection didReceiveData:(NSData )data { [dataJSON appendData:data]; }

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
NSError *error;
UIImageView *image1;
NSMutableArray *coleccion=[[NSMutableArray alloc] init];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:dataJSON options:kNilOptions error:&error];
NSArray *data = [dic objectForKey:@"data"];
if (!dic) {
    NSLog(@"Error parsing JSON");
} else {
    for(NSDictionary *item in [dic objectForKey:@"data"]) {
        for(NSDictionary *attachment in [item objectForKey:@"images"]) {
            NSString *nombre = [attachment objectForKey:@"source"];
            NSURL * imageURL = [NSURL URLWithString:nombre];
            NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
            image1 = [UIImage imageWithData:imageData];
            [items addObject:image1];
        }
    }
}
//[self.view setNeedsDisplay];
}

最後に、コレクション ビューを使用してギャラリーを作成しました。

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [items count]*5;
}

-(UICollectionViewCell )collectionView:(UICollectionView )collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{
  static NSString *identifier = @"CollectionCell";
  UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
  UIImageView *imageView = (UIImageView *)[cell viewWithTag:1];
  imageView.image = [items objectAtIndex:indexPath.row%1];
  return cell;
}

さて、アプリを実行しても画像が読み込まれませんでした。なぜですか? 画像を表示するにはどうすれば解決できますか? 演習はこれとほぼ同じです: http://www.techotopia.com/index.php/An_iPhone_iOS_6_Storyboard-based_Collection_View_Tutorial 違いは、Facebook グラフの画像をダウンロードする必要があり、プロジェクトに既に読み込まれていないことです。

どうもありがとうございました。

4

2 に答える 2

0

ここで目にする主な問題は、アイテムの読み込みに時間がかかることです。UI が応答しなくなるだけなので、メイン スレッドでアイテムを読み込んでも意味がありません。メイン スレッドで実行しない 1 行のコードを探している場合は、次のようになります。

 NSData * imageData = [NSData dataWithContentsOfURL:imageURL];

もう 1 つの (関連する) 問題は、アイテムの準備が整う前に、collectionView デリゲートが "cellForItemAtIndexPath" & "numberOfItemsInSection" を呼び出すことです。新しくダウンロードされたアイテムが表示されるようにするには、UICollectionView インスタンスで "reloadData" を実行する必要があります。それらの準備がすべて整って、items 配列に挿入されます。

お役に立てれば

于 2012-12-15T10:47:12.700 に答える
0

アイテムのロードに時間がかかり、ロードする意味がないため、これを持っています。私のニュースの方法は次のとおりです。

- (void)viewDidLoad
{
[super viewDidLoad];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSInvocationOperation *websOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImages) object:nil];
[queue addOperation:websOperation];
}

-(void)loadImages{
NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/NBAStoreNYC/photos"];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
if (connection) {
    NSLog(@"Connecting...");
    dataJSON = [[NSMutableData alloc] init];
} else {
    NSLog(@"ERROR: Unable to create connection.");
}
}

しかし、方法:

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
NSError *error;
UIImageView *image1;
NSMutableArray *coleccion=[[NSMutableArray alloc] init];

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:dataJSON options:kNilOptions error:&error];
//con esto saco las imagenes de la url
NSArray *data = [dic objectForKey:@"data"];
if (!dic) {
    NSLog(@"Error parsing JSON");
} else {
    for(NSDictionary *item in [dic objectForKey:@"data"]) {
        for(NSDictionary *attachment in [item objectForKey:@"images"]) {
            NSString *nombre = [attachment objectForKey:@"source"];
            NSLog(@"%@", nombre);
            NSURL * imageURL = [NSURL URLWithString:nombre];
            NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
            image1 = [UIImage imageWithData:imageData];
            [items addObject:image1];
        }
    }
}

//[self.view setNeedsDisplay];
}

実行しないのはなぜですか?私はブレークポイントを入れましたが、これはこのメソッドでは入りません。

于 2012-12-15T17:45:36.083 に答える