5

私のサーバーには、名前が phpmysql テーブルに保存されている画像がほとんどありません。このテーブルには、id と images の 2 つのフィールドが含まれています。前述のように、json でエンコードされた形式の画像を取得するための php を用意しました。

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 にアクセスすると、次の応答が返されます。

[{"画像":"./95462"},{"画像":"./8838upload_image.jpg"}{"画像":"./43185upload_image.jpg"},{"画像":"/17426upload_image.jpg "}]

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

次のステップは、上記の配列をマルチスレッドで UITableView に表示することです。ハードコードするときにURLから画像を取得していますが、json解析に関しては初心者です。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メソッドを試しました。私はそれでいくつかの間違いを犯しているかもしれませんが、私はずっとイライラしています. どうか助けてください。

4

3 に答える 3

2

SDWebImageを使用することをお勧めします

Web イメージ このライブラリは、Web からのリモート イメージをサポートする UIImageView のカテゴリを提供します。

以下を提供します。

Cocoa Touch フレームワークに Web イメージとキャッシュ管理を追加する UIImageView カテゴリ 非同期イメージ ダウンローダ 非同期メモリ + 自動キャッシュ期限切れ処理によるディスク イメージ キャッシュ 同じ URL が複数回ダウンロードされないという保証 偽の URL がダウンロードされないという保証何度でもやり直せる公演!

于 2012-04-20T05:45:22.307 に答える
2

おい..次のリファレンスを使用すると、チュートリアルが動作するデモとして取得されます..

マルチスレッドを使用した UITableView の画像

iOS を初めて使用する場合は、このリファレンスを参照してください。それは簡単です

うまくいけば、これはあなたを助けるでしょう...

于 2012-04-20T05:40:01.443 に答える
1

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

于 2012-04-20T05:47:47.910 に答える