1

我基本上是在 JSON 上获取图像,然后将其显示在屏幕上。在我目前的代码中,它工作正常,只是它在我的while循环之后显示图像。

我想要的是每次循环迭代时显示图像。如果可能的话,也像 Apple 的 Trailers.app 一样显示渐变的图像。

这是我现在的代码:

- (void)getNowShowingList2
{
    self.navigationItem.rightBarButtonItem = nil;

    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    activityIndicator.hidesWhenStopped = YES;
    UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
    [self navigationItem].rightBarButtonItem = barButton;
    [activityIndicator startAnimating];

    NSString *str = HOMEVIEW_URL;

    NSURL *url = [NSURL URLWithString:str];
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSString *jsonStr = [[[NSString alloc] initWithData:data
                                               encoding:NSUTF8StringEncoding] autorelease];

    // Checks for internet connectivity at startup
    if ([jsonStr isEqualToString:@""])
    {
        HideNetworkActivityIndicator();

        [self performSelectorOnMainThread:@selector(networkConnectivityCheck)
                                   withObject:nil
                                waitUntilDone:YES];
    }
    else
    {
        // Parse the string into JSON
        NSDictionary *json = [jsonStr JSONValue];

        // Get all object
        NSArray *items = [json valueForKeyPath:@"QUERY.DATA"];
        NSEnumerator *enumerator = [items objectEnumerator];

        NSArray *item;

        while (item = [enumerator nextObject])
        {
            [myMovieId      addObject:[item objectAtIndex:0]];
            [myMovieTitle   addObject:[item objectAtIndex:1]];

            NSString *genre = @"";

            if (genre == NULL)
            {
                genre = @"";
            }
            else
            {
                genre = [item objectAtIndex:2];
            }

            [myGenre    addObject:genre];
            [myCast     addObject:[item objectAtIndex:3]];
            [myPrice    addObject:[item objectAtIndex:4]];
            [myRuntime  addObject:[item objectAtIndex:5]];
            [myImageUrl addObject:[item objectAtIndex:6]];
            [myRating   addObject:[item objectAtIndex:7]];
            [myHits     addObject:[item objectAtIndex:8]];

            NSURL *url = [NSURL URLWithString:[item objectAtIndex:6]];
            NSData *data = [NSData dataWithContentsOfURL:url];

            if (data == nil) // checks if internet connection was lost while parsing & fetching
            {
                HideNetworkActivityIndicator();

                [self performSelectorOnMainThread:@selector(lostPrompt)
                                       withObject:self
                                    waitUntilDone:YES];

                break;
            }
            else
            {
                [myImage addObject:[UIImage imageWithData:data]];

                [self getMovieDetails:[item objectAtIndex:0]];
            }

            NSLog(@"O");
            [self displayButton2];
        }

        activityIndicator.hidden = YES;

        self.navigationItem.rightBarButtonItem = self.refreshButton;
    }

    [self performSelectorOnMainThread:@selector(versionCheck)
                           withObject:nil
                        waitUntilDone:YES];
}


- (void)displayButton2
{   
    int offset_x  = 19;
    int offset_y = 24;

    for (int i = 0; i < [myImage count] ; i++)
    {
        // compute x & y offset
        if (i % 3 == 0)
        {
            offset_x = 19;
        }
        else if (i % 3 == 1)
        {
            offset_x = 113;
        }
        else
        {
            offset_x = 208;
        }

        // Display Movie Thumbnail
        UIImage *imageView1 = [myImage objectAtIndex:i];
        CGRect myImageRect1 = CGRectMake(offset_x, offset_y, MOVIE_THUMBNAIL_W, MOVIE_THUMBNAIL_H);

        UIButton *button1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
        button1.frame = myImageRect1;
        button1.backgroundColor = [UIColor clearColor];
        [button1 setBackgroundImage:imageView1 forState:UIControlStateNormal];
        button1.tag = i;
        [button1 addTarget:self
                    action:@selector(imageButtonPressed:)
          forControlEvents:UIControlEventTouchUpInside];
        [scrollview addSubview:button1];

        // Quick Buy Image
        UIImage *buy_image = QUICK_BUY_BUTTON;
        CGRect myImageRect2 = CGRectMake(offset_x + (MOVIE_THUMBNAIL_W-QUICK_BUY_BUTTON_W-2), offset_y + 2, QUICK_BUY_BUTTON_W, QUICK_BUY_BUTTON_H);

        UIButton *button2 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
        button2.frame = myImageRect2;
        button2.backgroundColor = [UIColor clearColor];
        [button2 setBackgroundImage:buy_image forState:UIControlStateNormal];
        button2.tag = i;
        [button2 addTarget:self
                    action:@selector(quickBuyButtonPressed:)
          forControlEvents:UIControlEventTouchUpInside];
        [scrollview addSubview:button2];

        // increment offset
        if (offset_x == 208)
        {
            offset_y += 150;
        }
    }

    if ((offset_x == 19) || (offset_x == 113))
    {
        offset_y += 158;
    }

    // Adjust scroll view
    [scrollview setContentSize:CGSizeMake(0, offset_y + 10)];

    // adjust background
    [background setFrame:CGRectMake(13, 13, 294, offset_y - 17)];
    backgroundHeightAdjust = offset_y - 17;
}

从长远来看,我还计划使用 AFNetworking,因为它可能有助于实现我想要达到的效果。

4

1 回答 1

0

Parse the JSON in background thread. Every time you need to load an image, set it to the image imageView in the main thread.

...
// Parse the string into JSON
[self performSelectorInBackground:@selector(parseJson:) withObject:jsonStr];
// ...

-(void)parseJson:(NSString*)jsonStr{

      // Parse Json ...
      // Show image on main thread
      [self performSelectorOnMainThread:@selector(showImage:)
                             withObject:image
                          waitUntilDone:NO];

}

-(void)showImage:(UIImage *)image{
      imageView.image = image;
}
于 2013-01-10T09:30:37.230 回答