Ecco come ho fatto: invece di
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]
ho fatto la stessa istanza metodo basato sulla classe che contiene, dal momento che ci sarà ho bisogno di un delegato. E non renderlo singleton, quindi ogni connessione ha le sue variabili indipendenti, perché, se non lo facciamo, e due connessioni vengono chiamate prima che l'altra termini, quindi i dati ricevuti e la gestione dei loop verranno intrecciati irrecuperabilmente .
[[ClassNameHere new] sendSynchronousRequest:request returningResponse:&response error:&error]
in questo modo posso creare una connessione NSUrl e gestire la cosa (in modo sincrono, vedremo come) in modo da non dover modificare qualsiasi del codice scritto in precedenza.
- (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse *__strong*)response error:(NSError *__strong*)error
{
_finishedLoading=NO;
_receivedData=[NSMutableData new];
_error=error;
_response=response;
NSURLConnection*con=[NSURLConnection connectionWithRequest:request delegate:self];
[con start];
CFRunLoopRun();
return _receivedData;
}
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
//handle the challenge
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
*_response=response;
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
*_error=error;
CFRunLoopStop(CFRunLoopGetCurrent());
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
CFRunLoopStop(CFRunLoopGetCurrent());
}
Il trucco era in CFRunLoopRun() e CFRunLoopStop (CFRunLoopGetCurrent()) Spero che aiuta qualcun altro in futur.
Il ragazzo ha bisogno di una chiamata di funzione dipendente dall'istanza per fornire al delegato la risposta alla sfida https – LolaRun
Grazie :) È così semplice. –