2012-02-10 21 views
14

Chcę zrobić NSURLConnection w trybie tła, ponieważ ma on wiele danych. Fora mówią, aby użyć kodowania skończonej długości Apple do użycia w didEnterBackground. , ale chcę tego uniknąć. W tym przypadku używam następującego kodu przez NSOperation z NSInvocation jako, ale to nie działa. connectToServer ma NSURLConnection operation.any pomóc proszę? didReceiveData, didReceiveResponse metody delegatów nie są wywoływane?Asynchroniczny NSURLConnection z NSOperation

NSOperationQueue *queue = [NSOperationQueue new]; 

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

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

-(void)connectToServer 
{ 
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

Twoje pytanie nie jest jasne –

+0

Proszę zobaczyć moje zmodyfikowane pytanie? – nameless

Odpowiedz

42

Ten rodzaj pytano czas Zillion. Delegaci nie są wywoływani, ponieważ od operacji iOS 4 uruchamiane są operacje na wątku dodatkowym. Wątek prawdopodobnie kończy się przed wywołaniem delegatów, to wszystko.

Zachowaj połączenie w głównym wątku i zachowaj dane w wątku tła za pomocą GCD.

I'v pisał o wszystkich tych rzeczy tutaj: http://cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

EDIT: Aktualizacja łącza.

+2

Ciesz się moimi ciężko wypracowanymi 50 głosami.u powinienem odpowiedzieć przed moją nagrodą :) – nameless

+0

czy możesz powiedzieć, jak zatrzymać Runloopa i port? – nameless

+5

[runLoop removePort: PORT forMode: MODE]; CFRunLoopStop (CFRunLoopGetCurrent()); – Nyx0uf

0

spojrzenie na sendAsynchronousRequest: kolejki: completionHandler: Metoda udokumentowane here in Apple's Documentation. Umożliwia asynchroniczne żądania z NSURLConnection.

Uwaga ta wymaga iOS5 lub wyższej

+0

Mam nadzieję, że jest tylko dla MAC Jedynym – nameless

+0

Pierwszym linkiem jaki miałem był dla Maca, zaktualizowałem go dla wersji na iOS. Czy chcesz odniesienia do Mac? Dokumentację dla Maca można znaleźć tutaj: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697- DontLinkElementID_1 –

+0

Chcę zrobić w iOS4 ... proszę odpowiedzieć na moje pytanie, dlaczego to nie działa? – nameless

6

Firma Apple zapewnia QHTTPOperation, która robi dokładnie to, czego oczekujesz, zawiera enkodowanie NSURLConnection w ramach NSOperation, dla pojedynczego żądania. Można go znaleźć w Apple sample code.

QHTTPOperation to w rzeczywistości podklasa QRunLoopOperation, która umożliwia enkapsulację logiki, która zależy od wywołań zwrotnych w pętli w NSOperacji.

Zewnętrzna strona ASIHTTPRequest jest podobnym popularnym rozwiązaniem, AFAIK, ale nie jest już dłużej utrzymywana.