2010-11-14 36 views
2

Je charge des images avec cette classe. J'ai besoin d'aide pour les empêcher de se charger quand dealloc est appelé. Cette classe étend UIImageView. Aussi tout autre conseil pour la conception de la classe est apprécié, je vais vouloir par exemple expédier les octets chargés.Arrêt d'une photo d'un nouveau fil à charger

@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 

Répondre

2

dataWithContentsOfURL: est conçu pour bloquer jusqu'à son expiration ou finit de recevoir une réponse complète. Vous semblez vouloir interrompre le thread d'arrière-plan lorsque sa vue associée est désallouée. Ces faits sont fondamentalement en désaccord.

Si vous souhaitez mettre fin à la demande le plus rapidement possible lorsque votre objet va loin, cela peut être fait en faisant une demande asynchrone avec NSURLConnection et cancel ing dans votre méthode dealloc. S'il n'est pas annulé avant la réception de la réponse, vous recevrez un rappel connectionDidFinishLoading: sur votre délégué, à partir duquel vous pourrez reconstituer votre UIImage à partir des données reçues.

+0

Merci, c'est tout. –

0

Code final:

- (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]; 
}