2010-08-23 3 views
5

J'écris un code qui lit les données d'une connexion http et les stocke dans un tableau d'octets. J'ai écrit ma propre classe NSOperation. Référence du code estNSURLConnection dans NSOperation

Concurrent Operations Demystified

Ma déclaration de classe HttpWorker est comme

@interface HttpWorker : NSOperation{ 

    NSString *param; 
    double requestCode; 
    BOOL isLive; 
    long initSleep; 
    BOOL _isFinished; 
    BOOL _isExecuting; 
    NSURL *_url; 
    NSURLConnection *_connection; 
    NSData *_data; 


} 

@property (nonatomic, retain) NSString *param; 
@property (nonatomic) double requestCode; 
@property (nonatomic) BOOL isLive; 
@property (nonatomic) long initSleep; 
@property (readonly) BOOL isFinished; 
@property (readonly) BOOL isExecuting; 
@property (readonly, copy) NSURL *url; 
@property (nonatomic, retain) NSURLConnection *httpCon; 
@property (readonly, retain) NSData *data; 



-(id)initWithUrl:(NSURL *)_url; 
-(void) setRequestParameters:(NSString *)parameters iRequestCode:(double)iRequestCode initialSleep:(long)initialSleep; 

@end 

Et ma classe HttpWorker.m est comme

#import "HttpWorker.h" 
#import "Resources.h" 


@implementation HttpWorker 

@synthesize param; 
@synthesize requestCode; 
@synthesize isLive; 
@synthesize initSleep; 
@synthesize isFinished = _isFinished; 
@synthesize isExecuting = _isExecuting; 
@synthesize url = _url; 
@synthesize data = _data; 


-(id) initWithUrl: (NSURL *)Url{ 
    self = [super init]; 
    if(self == nil){ 
     return nil; 
    } 
    _url = [Url copy]; 
    _isExecuting = NO; 
    _isFinished = NO; 
    return self; 
} 

-(BOOL) isConcurrent{ 
    return YES; 
} 

-(void) start{ 
    if(![NSThread isMainThread]){ 
     [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO]; 
     return; 
    } 
    [self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:_url]; 
    NSLog(@"Connecting... %@",_url); 
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately: YES]; 
    if(_connection == nil){ 
     NSLog(@"connection is nil"); 
    } 
} 


-(void) setRequestParameters:(NSString *)parameters iRequestCode:(double)iRequestCode initialSleep:(long)initialSleep { 
    self.param = parameters; 
    self.requestCode = iRequestCode; 
    self.initSleep = initialSleep; 
} 

/////////////////////////// delegate methods /////////////////////////////// 

-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    NSLog(@"receieved response..."); 
    _data = [[NSData alloc] init]; 
} 


-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)incomingData { 
    NSLog(@"receieved data..."); 
} 


-(void) connectionDidFinishLoading:(NSURLConnection *) connection { 
    NSLog(@"connection did finish loading..."); 
} 


@end 

Le problème est que quand je lance ce code et ajouter l'objet httpworker à NSOperationQueue, le code s'exécute correctement et _connection n'est pas nul mais aucune des méthodes déléguées n'est exécutée. quelqu'un peut-il aider s'il vous plait?

Merci et meilleures salutations ...

Répondre

0

Votre délégué pour la connexion est "auto" (= votre objet NSOperation). Je suppose que cet objet est déjà parti quand la connexion veut envoyer des messages au délégué.

Votre système NSOperation ne dispose pas d'une implémentation "principale". Par conséquent, rien ne se passera après le démarrage du thread. Il va (asynchrone!) Tirer le NSOperation et quitter.

Voir: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperation/main


Bottom line: Je recommande fortement ASIHTTPRequest pour ce genre de tâche.

http://allseeing-i.com/ASIHTTPRequest/

+1

Votre hypothèse est incorrecte: de NSURLConnection les Etats doc: « Pendant le téléchargement, la connexion maintient une forte référence au délégué Il libère cette référence forte lorsque la connexion se termine le chargement, échoue ou est annulée. ». En outre, le problème lié à l'utilisation d'un framework ou d'une bibliothèque tiers est que les tiers cessent souvent de prendre en charge leur solution, comme cela s'est produit avec ASIHTTPRequest. –

+0

@elise toute aide ici NSURLConnection et la confusion NSRunLoop - http://stackoverflow.com/q/24895099/559017 – Zeeshan