2012-02-10 20 views
14

Voglio fare NSURLConnection in modalità background, perché la risposta ha molti dati. Per i forum si dice di usare la codifica di lunghezza finita di Apple da utilizzare in . ma voglio evitarlo. Invece di usare il seguente codice attraverso NSOperation con NSInvocation come, ma non funziona. connectToServer sta avendo un'operazione NSURLConnection.un aiuto, per favore? didReceiveData, didReceiveResponse i metodi delegati non vengono chiamati?NSURLConnection asincrono con 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

La tua domanda non è chiara –

+0

per favore vedi la mia domanda modificata? – nameless

risposta

42

Questo tipo di domanda è stato chiesto un periodo zillion. I delegati non vengono richiamati perché a partire da iOS 4 le operazioni vengono avviate su un thread secondario. Il thread probabilmente esce prima che i delegati vengano chiamati così.

Mantenere la connessione sul thread principale e gestire i dati in un thread in background tramite GCD.

I'v scritto su tutta questa roba qui: http://cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

EDIT: aggiornato collegamento.

+2

goditi i miei duri 50 voti. Dovresti aver risposto prima della mia generosità :) – nameless

+0

puoi dirmi come fermare Runloop e port? – nameless

+5

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

0

sguardo al sendAsynchronousRequest: coda: completionHandler: metodo documentato here in Apple's Documentation. Permette richieste asincrone con NSURLConnection.

Nota questo richiede iOS5 o superiore

+0

spero sia per MAC solo – nameless

+0

Il primo collegamento che avevo era per il Mac, l'ho aggiornato per la versione iOS. Stai volendo il riferimento Mac? La documentazione del Mac è disponibile qui: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697- DontLinkElementID_1 –

+0

Voglio fare in iOS4 ... per favore rispondi alla mia domanda perché non funziona? – nameless

6

Apple fornisce QHTTPOperation, che fa proprio quello che vuoi, incapsula un NSURLConnection all'interno di un NSOperation, per una singola richiesta. Puoi trovarlo in Apple sample code.

QHTTPOperation è in realtà una sottoclasse di QRunLoopOperation che consente di incapsulare la logica che dipende callback run-anello in un NSOperation.

La terza parte ASIHTTPRequest è una soluzione simile, AFAIK non è più gestita.