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 ...
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. –
@elise Hilfe hier NSURLConnection und NSRunLoop Verwirrung - http://StackOverflow.com/Q/24895099/559017 – Zeeshan