2010-08-23 11 views
5

Estoy escribiendo un código que lee datos de una conexión http y los almacena en una matriz de bytes. He escrito mi propia clase NSOperation. Referencia del código esNSURLConnection en NSOperation

Concurrent Operations Demystified

Mi declaración de la clase HttpWorker es como

@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 

Y mi clase HttpWorker.m es como

#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 

El problema es que cuando funciono con el código y agregue el objeto httpworker al NSOperationQueue, el código se ejecuta correctamente y _connection no es nulo, pero no se ejecuta ninguno de los métodos de delegado. Alguien puede ayudarme porfavor?

Gracias y un saludo ...

Respuesta

0

su delegado para la conexión es "auto" (= el objeto NSOperation). Supongo que este objeto ya no está cuando la conexión quiere enviar mensajes al delegado.

Su NSOperation no tiene una implementación "principal". En consecuencia, nada sucederá después de que se inicie el hilo. Va a (¡asincrónicamente!) Disparar la NSOperation y salir.

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


En pocas palabras: Le recomiendo ASIHTTPRequest para este tipo de tarea.

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

+1

Su suposición no es correcta: los estados de documentación de NSURLConnection: "Durante la descarga de la conexión mantiene una fuerte relación con el delegado Libera esa referencia fuerte cuando la conexión termina de cargar, falla o se cancela.". Además, el problema de decirle a las personas que utilicen un marco o biblioteca de terceros es que los terceros a menudo dejan de apoyar su solución, como ha sucedido con ASIHTTPRequest. –

+0

@elise cualquier ayuda aquí NSURLConnection y NSRunLoop confusión - http://stackoverflow.com/q/24895099/559017 – Zeeshan