2012-02-10 3 views
0

Я должен использовать Asynchrnous NSURLConnection внутри NSOPeration в фоновом режиме, потому что его ответ имеет большие данные. Мне нужно избегать кодирования конечной длины Apple для использования в didEnterBackground. Вместо этого я использую следующий код через NSOperation с NSInvocation как, но это не work.connectToServer работает с NSURLConnection.any help please? didReceiveData, didReceiveResponse методы делегата не вызываются?ASynchronous NSURLConnection внутри NSOperation с NSInvocation?

-(void)viewDidLoad 
{ 
NSOperationQueue *queue = [NSOperationQueue new]; 

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
                     selector:@selector(connectServer) 
                      object:nil]; 

[queue addOperation:operation]; 
[operation release]; 
[queue autorelease]; 

}

-(void)connectServer 
{ 


NSURL *url = [NSURL URLWithString:@"http://www.google.com"]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; 
NSURLConnection *theConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease]; 

    if(theConnection) 
    { 
     webData = [[NSMutableData data] retain]; 
    } 
    else 
    { 
     NSLog(@"theConnection is NULL"); 
    } 
} 

}

+0

Возможный дубликат [Асинхронный NSURLConnection с NSOperation] (http://stackoverflow.com/questions/9223537/asynchronous-nsurlconnection-with-nsoperation) –

+0

- вызов метода connectServer? –

ответ

0

Я мог бы быть неправильно об этом, но все-таки Виль попробовать ...

Смотрите документы говорят ... для start метода

start Причиняет подключение gin, если у него уже нет .

  • (аннулируются) начать обсуждение Вызов этого метода необходимо только при создании соединения с initWithRequest: делегат: startImmediately: метод и обеспечить NO для : параметр startImmediately. Если вы не планируете подключение в цикле выполнения или очереди операций перед вызовом этого метода, соединение запланировано в текущем цикле выполнения в режиме по умолчанию.

так мне кажется, вам придется само начало подключения вручную, так как он находится внутри очереди операций. исправьте меня, если я ошибаюсь.

+0

Я пробовал, он не работает. Помогите пожалуйста? –

1

Всякий раз, когда вы хотите запустить NSURLConnection на вторичном потоке, необходимо добавить, что подключение к runloops

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url 
       cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self 
       startImmediately:YES]; 
    [request release]; 


[_connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[_connection start]; 

    [pool release]; 
+0

Я пробовал эту кодировку, она не работает. Помогите пожалуйста? –

2

мммм может быть, вы могли бы сделать связь внутри блока для основной очереди с этим:

dispatch_async(dispatch_get_main_queue(), ^{ 

     NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
     _connection = [[NSURLConnection alloc] initWithRequest:request startImmediately:YES]; 
     [request release]; 
}); 

, а затем следует вызвать методы делегата.

Смежные вопросы