NSURLConnection nie wywołuje zakończenia w wielu widokach

Wcześniej dzisiaj zadałem następujące pytanie:Blokowanie systemu iOS jest zatrzymywane po naciśnięciu widoku

Operacja, o której wspomniałem (OP1), jest w rzeczywistości „http get” na moim serwerze za pomocą NSURLConnection.
Po jeszcze większym badaniu odkryłem, że blok nie „umiera”. To, co naprawdę się dzieje, to fakt, że żądanie jest rzeczywiście wysyłane (strona serwera rejestruje to), nawet po naciśnięciu widoku (zweryfikowanego za pomocą [NSThread sleep: 10]). Serwer odpowiada, ale NIC nic się nie dzieje po stronie aplikacji, jeśli widok2 został wciśnięty! prawie tak, jakby połączenie straciło swojego delegata! Inną możliwością jest to, że NSURLConnection jest narsMainLoop związane z?"

Czy ktoś może pomóc?

Pls nie zapominaj, że:
0. Wszystko działa dobrze, dopóki widok2 nie zostanie wciśnięty aż do zakończenia operacji.
1. Żądanie jest wysyłane asynchronicznie
2. Ustawiłem delegata i działa tak długo, jak widok się nie zmienia
3. widok1 rozpoczyna operację za pomocą właściwości „singleton object reference” „OP1Completed”
4. widok2 sprawdza ukończenie OP1 poprzez propertie na temat „odwołania do obiektu singleton”
5. widok2 pobiera „wynik” przechodząc do właściwości „singleton.OP1Result”

Edytuj 1:
Ok, miejmy trochę kodu. Najpierw jest odpowiedni kod mojego singletona (o nazwie „Interakcja”):

-(void)loadAllContextsForUser:(NSString *)username{
userNameAux = username;
_loadingContextsCompleted = NO;
if (contextsLoaderQueue == NULL) {
    contextsLoaderQueue = dispatch_queue_create("contextsLoaderQueue", NULL);
}

dispatch_async(contextsLoaderQueue, ^{
    NSLog(@"Loading all contexts block started");
    [self requestConnectivity];

    dispatch_async(dispatch_get_main_queue(), ^{
        [Util Get:[NSString stringWithFormat:@"%@/userContext?username=%@", Util.azureBaseUrl, [username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]
     successBlock:^(NSData *data, id jsonData){
         NSLog(@"Loading all contexts block succeeded");
         if([userNameAux isEqualToString:username]){
             _allContextsForCurrentUser = [[NSSet alloc]initWithArray: jsonData];
         }
     } errorBlock:^(NSError *error){
         NSLog(@"%@",error);
     } completeBlock:^{
         NSLog(@"load all contexts for user async block completed.");
         _loadingContextsCompleted = YES;
         [self releaseConnectivity];
     }];
    });

    while (!_loadingContextsCompleted) {
        NSLog(@"loading all contexts block waiting.");
        [NSThread sleepForTimeInterval:.5];
    }
});
NSLog(@"Load All Contexts Dispatched. It should start at any moment if it not already.");
}

A oto klasa Util, która faktycznie obsługuje żądanie / odpowiedź

-(id)initGet:(NSString *)resourceURL successBlock:(successBlock_t)successBlock errorBlock:(errorBlock_t)errorBlock completeBlock:(completeBlock_t)completeBlock;{
if(self=[super init]){
    _data=[[NSMutableData alloc]init];
}

_successBlock = [successBlock copy];
_completeBlock = [completeBlock copy];
_errorBlock = [errorBlock copy];

NSURL *url = [NSURL URLWithString:resourceURL];
NSMutableURLRequest *request = [NSURLRequest requestWithURL:url];
[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
//[_conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
//[_conn start];
NSLog(@"Request Started.");

return self;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [_data setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_data appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
id jsonObjects = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];

id key = [[jsonObjects allKeys] objectAtIndex:0];
id jsonResult = [jsonObjects objectForKey:key];

_successBlock(_data, jsonResult);
_completeBlock();
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
_errorBlock(error);
_completeBlock();
}

I wreszcie oto odpowiednia część VC1 (pchanie w VC2)

- (IBAction)loginClicked {
NSLog(@"login clicked. Preparing to exibit next view");

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
AuthenticationViewController *viewController = (AuthenticationViewController *)[storyboard instantiateViewControllerWithIdentifier:@"ContextSelectionView"];

NSLog(@"Preparation completed. pushing view now");

[self presentViewController:viewController animated:YES completion:nil];
}

questionAnswers(5)

yourAnswerToTheQuestion