2010-08-23 15 views
5

Ich schreibe einen Code, der Daten von einer HTTP-Verbindung liest und in einem Byte-Array speichert. Ich habe meine eigene NSOperation-Klasse geschrieben. Referenz des Codes istNSURLConnection in NSOperation

Concurrent Operations Demystified

Erklärung Meine HttpWorker Klasse ist wie

@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 

Und meine HttpWorker.m Klasse wie ist

#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 

Problem ist, dass, wenn ich diesen Code ausführen und fügen Sie httpworker-Objekt der NSOperationQueue hinzu, der Code wird erfolgreich ausgeführt, und _connection ist nicht null, aber keine der Delegatmethoden wird ausgeführt. Kann mir bitte jemand helfen?

Danke und viele Grüße ...

Antwort

0

Ihr Delegat für die Verbindung ist "Selbst" (= Ihr NSOperation Objekt). Ich nehme an, dieses Objekt ist bereits verschwunden, wenn die Verbindung Nachrichten an den Delegaten senden möchte.

Ihre NSOperation hat keine "Haupt" -Implementierung. Folglich wird nichts passieren, nachdem der Thread gestartet wurde. Es wird (asynchron!) Die NSOperation auslösen und beenden.

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


Fazit: Ich empfehle ASIHTTPRequest für diese Art von Aufgabe hoch.

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

+1

Ihre Annahme ist nicht korrekt: NSURLConnection der doc heißt es: „Während des Herunterladens die Verbindung zu den Delegierten einen starken Bezug hält Es löst, dass eine starke Referenz, wenn die Verbindung fertig geladen, fehlschlägt oder abgebrochen wird.“. Außerdem besteht das Problem darin, Dritten zu sagen, dass sie ein Framework oder eine Bibliothek eines Drittanbieters verwenden sollten, dass Dritte ihre Lösung oft nicht mehr unterstützen, wie dies bei ASIHTTPRequest der Fall war. –

+0

@elise Hilfe hier NSURLConnection und NSRunLoop Verwirrung - http://StackOverflow.com/Q/24895099/559017 – Zeeshan