2010-08-23 4 views
5

Я пишу код, который считывает данные из 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, код выполняется успешно, а _соединение не ноль, но ни один из методов делегата не выполняется. Кто-нибудь может помочь?

Спасибо и наилучшие пожелания ...

ответ

0

Делегат для подключения, "Я" (= ваш объект NSOperation). Я предполагаю, что этот объект уже ушел, когда соединение хочет отправить сообщения делегату.

Ваш NSOperation не имеет «основной» реализации. Следовательно, ничто не произойдет после начала потока. Он будет (асинхронно!) Запускать NSOperation и выйти.

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


Итог: Я очень рекомендую ASIHTTPRequest для такого рода задач.

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

+1

Ваше предположение неверно: Doc состояние NSURLConnection в: «Во время загрузки соединение поддерживает сильную ссылку на делегат Это освобождает, что сильная ссылка, когда соединение заканчивает загрузку, выходит из строя, или отменяется..» Кроме того, проблема с тем, чтобы говорить людям об использовании сторонней структуры или библиотеки, заключается в том, что сторонние пользователи часто перестают поддерживать свое решение, как это произошло с ASIHTTPRequest. –

+0

@elise любая помощь здесь NSURLConnection и путаница NSRunLoop - http://stackoverflow.com/q/24895099/559017 – Zeeshan