2012-04-20 6 views
5

サーバ上に、名前がphpmysqlテーブルに保存されている画像はほとんどありません。テーブルには、IDと画像の2つのフィールドがあります。述べたように私はフォーマットされたJSONエンコードの画像を取得するためにPHPを用意していますマルチスレッドを使用してUITableViewでjsonイメージ配列を表示するには?

jsonFetch.php

<?php 
$dbhost = "localhost"; 
$dbname = "userauth"; 
$dbuser = "root"; 
//$DB_Pass = "root"; 
$dbtable = "images"; 

@mysql_connect($dbhost, $dbuser); 
$db = mysql_select_db($dbname); 


$sql = "SELECT * FROM $dbtable"; 
$query = mysql_query($sql); 

while($row = mysql_fetch_array($query)) 
    { 
     $rows[] = array(
     //"id" => $row[0], 
     "image" => $row[1] 
     //"description" => $row['description']); 
     ); 
    } 

$json = json_encode($rows); 
$callback = $_GET['images']; 
echo $callback.$json ; 
//print_r($json); 

?> 

私はURLを打ったとき、私は次の応答取得しています:

を[{ "image": "./ 95462"}、{"image": "./ 8838upload_image.jpg"} {"image": "./ 43185upload_image.jpg"}、{"image": "/ 17426upload_image.jpg"} ]

私は上記のようにjson配列を取得しています。

次のステップは、上記の配列をUITableViewでマルチスレッド形式で表示することです。 私はそれらをハードコードするときに私はURLから画像を取得していますが、それはjson解析になると、私はnoobです。私はjsonがあなたの参照のために解析できるすべての可能な方法を試しました。私は.mファイルを投稿しています。 :

#import "json.h" 

@interface profilePhotos(Private) 
- (void) initialize; 
- (void) loadImage:(id)arg; 
- (void) updateTableView:(id)arg; 
- (void) addImagesToQueue:(NSArray *)images; 
- (void) addImagesToQueue:(NSArray *)arrayImages; 
- (void) addImagesToQueue:(NSArray *)arrayDataFromServer; 
- (void) showcommentView; 
- (void) hidecommentView; 
@end 

@implementation profilePhotos 
@synthesize photosTable; 
@synthesize addPhotos; 
@synthesize deletePhotos; 
@synthesize back; 
@synthesize imageQueue, loadedImages, imageLoaderOpQueue, commentView; 
//@synthesize photosView; 


-(void)initializeWith:(int)buttonTag{ 

tag = buttonTag; 

NSLog(@"tag = %d", tag); 
} 

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    if (!(self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
    return self; 
    } 

[self initialize]; 
return self; 
    } 

- (void) awakeFromNib 
{ 
    NSLog(@"AsyncImageLoadingViewController::awakeFromNib called"); 
    [super awakeFromNib]; 
    [self initialize]; 
    } 

- (void) viewDidLoad 
{ 
NSLog(@"AsyncImageLoadingViewController::viewDidLoad called"); 
[super viewDidLoad]; 
} 

- (void) viewDidAppear:(BOOL)animated 
{ 
NSLog(@"AsyncImageLoadingViewController::viewDidAppear called"); 
[super viewDidAppear:animated]; 


NSArray *images = [NSArray arrayWithObjects: 
        @"http://dl.dropbox.com/u/9234555/avatars/ava01.gif", 
        @"http://dl.dropbox.com/u/9234555/avatars/ava02.gif", 
        @"http://dl.dropbox.com/u/9234555/avatars/ava03.gif", 
        @"http://dl.dropbox.com/u/9234555/avatars/ava04.gif", 
        @"http://dl.dropbox.com/u/9234555/avatars/ava05.gif", nil]; 

[self addImagesToQueue:images]; 
NSLog(@"addImagesToQueue: %@",self); 


} 


#pragma mark - 
#pragma mark Private Methods 

    /*! 
    @method  
    @abstract initializes class variables 
    */ 
- (void) initialize 
    { 
     NSLog(@"AsyncImageLoadingViewController::initialize called"); 

     NSMutableArray *a = [[NSMutableArray alloc] init]; 
     self.imageQueue = a; 
     //[a release]; 

     a = [[NSMutableArray alloc] init]; 
     self.loadedImages = a; 
     //[a release]; 

     NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
     self.imageLoaderOpQueue = queue; 
     //[queue release]; 
     } 

     /*! 
     @method  
     @abstract updates tableview for the newly downloaded image and scrolls the   tableview to bottom 
     */ 
    - (void) updateTableView:(id)arg 
     { 
     NSLog(@"AsyncImageLoadingViewController::updateTableView called"); 

     if ((arg == nil) || ([arg isKindOfClass:[UIImage class]] == NO)) { 
      return; 
    } 

    // store the newly downloaded image 
    [self.loadedImages addObject:arg]; 
    //[arg release]; 

    // refresh tableview 
    [self.photosTable reloadData]; 

    // scroll to the last cell of the tableview 
    NSIndexPath *lastRow = [NSIndexPath indexPathForRow:([self.loadedImages count] - 1) inSection:0]; 
    [self.photosTable scrollToRowAtIndexPath:lastRow 
          atScrollPosition:UITableViewScrollPositionBottom 
            animated:YES]; 
} 

/*! 
@method  
@abstract downloads images, this is the method that dispatches tasks in the operation q ueue 
*/ 
- (void) loadImage:(id)arg 
{ 
    NSLog(@"AsyncImageLoadingViewController::loadImage called"); 

    if ((arg == nil) || ([arg isKindOfClass:[NSString class]] == NO)) { 
    return; 
    } 

    // create a local autorelease pool since this code runs not on main thread 
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // fetch the image 
    NSLog(@"AsyncImageLoadingViewController::loadImage - will download image: %@", arg); 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:arg]]; 
    UIImage *image = [UIImage imageWithData:data]; 
    NSLog(@"image: %@",image); 

    // update tableview with the downloaded image on main thread 
    [self performSelectorOnMainThread:@selector(updateTableView:) withObject:image waitUntilDone:NO]; 

    //[pool release]; 
    } 

    /*! 
    @method  
    @abstract adds images to the queue and starts the operation queue to download them 
    */ 
- (void) addImagesToQueue:(NSArray *)images 
    { 
    NSLog(@"AsyncImageLoadingViewController::addImagesToQueue called"); 

    [self.imageQueue addObjectsFromArray:images]; 
    NSLog(@"addImagesToQueue Array: %@", self); 

    // suspend the operation queue 
    [self.imageLoaderOpQueue setSuspended:YES]; 

    // add tasks to the operation queue 
    for (NSString *imageUrl in self.imageQueue) { 
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self            selector:@selector(loadImage:) object:imageUrl]; 
     [self.imageLoaderOpQueue addOperation:op]; 
     // [op release]; 
     } 

// clear items in the queue and resume the operation queue to start downloading images 
[self.imageQueue removeAllObjects]; 
[self.imageLoaderOpQueue setSuspended:NO]; 
    } 


#pragma mark - 
#pragma mark UITableViewDataSource Methods 

    - (NSInteger)tableView:(UITableView *)tableView 
    numberOfRowsInSection:(NSInteger)section 
    { 

return [self.loadedImages count]; 



     } 

    - (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 
     { 

    static NSString *CellIdentifier = @"CellIdentifier"; 

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{  
    //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewStyleGrouped  reuseIdentifier:CellIdentifier] autorelease]; 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewStyleGrouped reuseIdentifier:[NSString stringWithFormat:@"cellID%d",indexPath.row]]; 

    cell.accessoryType =UITableViewCellAccessoryNone; 
    //cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator; 




    } 

for(UIView *subviews in cell.subviews) 
    [subviews removeFromSuperview]; 


    UIImageView *photo; 
    photo=[[UIImageView alloc] init]; 
    [photo setImage:[self.loadedImages objectAtIndex:indexPath.row]]; 
    [photo setFrame:CGRectMake(0, 5, 150, 120)]; 
    [cell addSubview:photo]; 
    return cell; 
     } 





    -(void)aMethod:(UIButton *)sender{ 

//[sender tag]; 

NSIndexPath *indexPath = [photosTable indexPathForCell: (UITableViewCell*)[[sender superview]superview]]; 

NSLog(@"[sender tag] is %d",[sender tag]); 



if([sender tag]==indexPath.row){ 

    textField = (UITextField*)[cell viewWithTag:[sender tag]]; 
    textField.hidden=NO; 
    } 
    //} 


    } 



#pragma mark - 
#pragma mark UITableViewDelegate Methods 

-(void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

[tableView deselectRowAtIndexPath:indexPath animated:YES]; 


} 




- (void)didReceiveMemoryWarning 
    { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
    } 

    - (void)viewDidUnload{ 
    // [self setPhotosView:nil]; 
    [self setPhotosTable:nil]; 
    [self setAddPhotos:nil]; 
    [self setDeletePhotos:nil]; 
    [self setBack:nil]; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
     } 

    - (BOOL)shouldAutorotateToInterfaceOrientation:( UIInterfaceOrientation)interfaceOrientation 
     { 
     // Return YES for supported orientations 
     return (interfaceOrientation == UIInterfaceOrientationPortrait); 
     } 

私はviewDidAppearメソッドで何かを行う必要があると信じていますが、それは何か分かりません。

親切に、私を助けてください。私はあらゆる可能なjsonメソッドを試しました。私はそれでいくつかのエラーをしているかもしれませんが、私はすべての方法で挫折しています。私を助けてください。

+0

誰でも上記のコードを把握することが可能であるならば、これは私が望んでいたほぼ正確に何であるとして私は、例えばトンありがとう – madLokesh

答えて

2

Dude..use参照以下とデモを作業としてチュートリアルを取得します。..

images in UITableView using multithreading

See this reference if you are new in iOS. It's simple

希望、これはあなたを助ける...

+0

をしてください知っているが、私は特定の直面していてくださいしてください上に掲示されたコードでこの例をどこに使うべきか、自分のやり方を変えるために例題自体を変更する必要がある場所についての問題です。私はiOS [2週間の経験]の初心者ですし、基礎を知る必要性を訓練しようとしています...助けてください,,,, – madLokesh

+0

@LokeshBhatija:初心者のために、あなたには簡単なことはありません。だから、ボットの記事を読んで読むことをお勧めします。私は新しいリファレンスを追加しました。 – Nit

+0

古いmarkofjohnsonプログラム。私はこれを経験してきました。 HJCacheがエラーを引き起こしています。私はすぐにそれらの間違いを掲示するでしょう。しばらくの間、私は以前のリファレンスで述べたように動作します – madLokesh

2

私はあなたを示唆使用するSDWebImage

Web画像 このライブラリは、 WebからのリモートイメージをサポートするUIImageVIewのカテゴリ。

それは提供しています。

ココアタッチフレームワーク 非同期画像ダウンローダ 保証を扱う自動キャッシュの有効期限と非同期メモリ+ディスクイメージのキャッシュにWebイメージとキャッシュ管理を追加

アンUIImageViewカテゴリ、同じURL何度もダウンロードされません 偽のURLが何度も再試行されないことを保証します パフォーマンス!

+0

あなたはsdwebviewを使って同じ行にいくつかの例を私に教えてください。 – madLokesh

1

それを試してみてください - https://github.com/rs/SDWebImage

+0

[リンク](http://www.raywenderlich.com/4295/multithreading-and-grandcentral-dispatch-on-ios-for-beginners-tutorial)に似たライブサンプルで私を助けてくれますか?私は同じことが必要ですが、違いは私はウェブサイトではなくlocalhostサーバーからイメージ配列が必要なことです。 – madLokesh

関連する問題