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 ...
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. –
@elise toute aide ici NSURLConnection et la confusion NSRunLoop - http://stackoverflow.com/q/24895099/559017 – Zeeshan