остановка фото из новой темы для загрузки - PullRequest
2 голосов
/ 14 ноября 2010

Я загружаю изображения с этим классом.Мне нужна помощь о том, как остановить их загрузку при вызове dealloc.Этот класс расширяет UIImageView.Также приветствуются любые другие советы по разработке класса, например, я хочу отправить загруженные байты.

@implementation RCPhoto

- (id)initWithFrame:(CGRect)frame delegate:(id)d {
    if ((self = [super initWithFrame:frame])) {
        // Initialization code
        delegate = d;
        self.contentMode = UIViewContentModeScaleAspectFit;
    }
    return self;
}

- (void)dealloc {
    [super dealloc];

}

#pragma mark Load photo
- (void)loadImage:(NSString *)path {
    // Create a new thread for loading the image
    [NSThread detachNewThreadSelector:@selector(load:) 
                             toTarget:self 
                           withObject:path];
}

- (void)load:(NSString *)path {

    // You must create a autorelease pool for all secondary threads.
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //NSLog(@"RCPhoto loadImage into a new thread: %@", path);
    NSURL *url = [NSURL URLWithString: path];
    NSData *data = [NSData dataWithContentsOfURL: url];
    UIImage *image = [[UIImage alloc] initWithData: data];

    [self performSelectorOnMainThread: @selector(performCompleteEvent:)
                           withObject: image
                        waitUntilDone: NO];

    [pool release];
}

- (void)performCompleteEvent:(UIImage *)image {
    //NSLog(@"RCPhoto finish loading");

    [self setImage:image];
    self.opaque = YES;

    if ([delegate respondsToSelector:@selector(onPhotoComplete)]) {
        [delegate performSelector:@selector(onPhotoComplete)];
    }
}


@end

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

dataWithContentsOfURL: предназначен для блокировки до истечения времени ожидания или до получения полного ответа. Вы, кажется, заинтересованы в прерывании фонового потока, когда связанный с ним вид освобождается. Эти факты принципиально расходятся.

Если вы хотите как можно быстрее завершить запрос, когда ваш объект исчезает, это можно сделать, выполнив асинхронный запрос с NSURLConnection и cancel, указав его в вашем методе dealloc. Если он не отменен до получения ответа, вы получите обратный вызов на connectionDidFinishLoading: вашего делегата, после чего вы сможете восстановить UIImage из полученных данных.

0 голосов
/ 16 ноября 2010

Финальный код:

- (void)loadImage:(NSString *)path {
    imageData = [[NSMutableData data] retain];
    NSURL *url = [NSURL URLWithString: path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)conn {
    UIImage *image = [[UIImage alloc] initWithData:imageData];
    [self setImage:image];
    self.opaque = YES;// explicitly opaque for performance
    [image release];
}
...