Я пишу код, который считывает данные из http-соединения и сохраняет в массиве байтов. Я написал свой собственный класс NSOperation. Ссылка на кодNSURLConnection в NSOperation
Concurrent Operations Demystified
Моя декларация класса HttpWorker подобна
@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
И мой HttpWorker.m класс как
#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
Проблема в том, что, когда я запускаю этот код и добавить объект httpworker в NSOperationQueue, код выполняется успешно, а _соединение не ноль, но ни один из методов делегата не выполняется. Кто-нибудь может помочь?
Спасибо и наилучшие пожелания ...
Ваше предположение неверно: Doc состояние NSURLConnection в: «Во время загрузки соединение поддерживает сильную ссылку на делегат Это освобождает, что сильная ссылка, когда соединение заканчивает загрузку, выходит из строя, или отменяется..» Кроме того, проблема с тем, чтобы говорить людям об использовании сторонней структуры или библиотеки, заключается в том, что сторонние пользователи часто перестают поддерживать свое решение, как это произошло с ASIHTTPRequest. –
@elise любая помощь здесь NSURLConnection и путаница NSRunLoop - http://stackoverflow.com/q/24895099/559017 – Zeeshan