Загрузка и изменение изображений асинхронными - PullRequest
0 голосов
/ 28 сентября 2011

Я загружаю 4 изображения с веб-сайта асинхронно, и после загрузки я меняю их с помощью таймера, но похоже, что в массиве изображений всегда первое изображение, когда я перехожу на другую позицию массива, в которой он находится. одно и то же изображение, вообще не меняется ...

- (void)viewDidLoad 
{
    [super viewDidLoad];

    [self getImages];
}

-(void)getImages
{
    receivedData = [[NSMutableData alloc]init];
    myImages = [[NSMutableArray alloc]init];
    myImagesAdresses = [[NSMutableArray alloc]initWithCapacity:5];

    [myImagesAdresses addObject:@"adress/Images/3.png"];
    [myImagesAdresses addObject:@"adress/Images/2.png"];
    [myImagesAdresses addObject:@"adress/Images/1.png"];
    [myImagesAdresses addObject:@"adress/Images/0.png"];

    [self loadNextImage];
}

-(void)loadNextImage
{
    if([myImagesAdresses count])
    {
        NSURL * imageURL = [NSURL URLWithString:[myImagesAdresses lastObject]];
        NSURLRequest * myRequest = [NSURLRequest requestWithURL:imageURL];
        [[NSURLConnection alloc]initWithRequest:myRequest delegate:self];
        NSLog(@"Start load URL %@",imageURL);
    }
    else {
        [self.theImage setImage:[myImages objectAtIndex:2]];
        [self changeImage];
        NSLog(@"No More Images to Load");
    }
}

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

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [myImages addObject:[UIImage imageWithData:[NSData dataWithData:receivedData]]];
    [connection release];
    connection = nil;
    NSLog(@"Image from %@ loaded",[myImagesAdresses lastObject]);
    [myImagesAdresses removeLastObject];
    [self loadNextImage];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [connection release];
    connection =nil;
    NSLog(@"Image from %@ not loaded", [myImagesAdresses lastObject]);
    [myImagesAdresses removeLastObject];
    [self loadNextImage];
}

и код для изменения изображения:

-(void)changeImage
{
    SEL selectorToCall = @selector(change: );

    NSMethodSignature *methodSignature = [[self class] instanceMethodSignatureForSelector:selectorToCall];

    NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
    [invocation setTarget:self];
    [invocation setSelector:selectorToCall];

    NSTimer * newTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 invocation:invocation repeats:YES];

    self.paintingTimer = newTimer;
}

- (void) change:(NSTimer *)paramTimer
{
    static NSInteger currentElement = 0;
    if(++currentElement == [myImages count]) currentElement = 0;
    [self.theImage setImage:[myImages objectAtIndex:currentElement]];
}

- (void) stopPainting
{
    if (self.paintingTimer != nil){
        [self.paintingTimer invalidate];
    }
}

Я не получаю никакой ошибки, но изображение просто не меняется ...

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Вы должны добавить эту строку кода после:

[myImages addObject:[UIImage imageWithData:[NSData dataWithData:receivedData]]];

следующим образом:

[myImages addObject:[UIImage imageWithData:[NSData dataWithData:receivedData]]];
[receivedData setData:nil];
1 голос
/ 29 сентября 2011

Похоже, receivedData - это ивар, к которому вы неоднократно добавляете данные, но он никогда не очищается. Поэтому после получения первого изображения второе изображение добавляется к нему и т. Д.

После этой строки вы должны очистить receivedData:

[myImages addObject:[UIImage imageWithData:[NSData dataWithData:receivedData]]];
...