NSURLConnection ruft nicht vollständig in mehreren Ansichten auf

Ich habe heute früher die folgende Frage gestellt:iOS-Block wird gestoppt, wenn die Ansicht verschoben wird

Die von mir erwähnte Operation (OP1) ist eigentlich ein "http get" für meinen Server, der NSURLConnection verwendet.
Nach noch mehr Nachforschungen stellte ich fest, dass der Block nicht wirklich "stirbt". Was wirklich passiert ist, dass die Anfrage tatsächlich SENT ist (die Serverseite protokolliert sie), auch nachdem die Ansicht gepusht wurde (überprüft über [NSThread sleep: 10]). Der Server antwortet, aber dann passiert NICHTS auf der App-Seite, wenn view2 gepusht wurde! fast als hätte die verbindung ihren delegierten verloren! Eine andere Möglichkeit, die ich mir anschaue, ist "die Tatsache, dass NSURLConnection auf dem Netz istrsMainLoop verbunden?"

Kann jemand helfen?

Bitte vergessen Sie das nicht:
0. Alles funktioniert einwandfrei, solange view2 nicht bis zum Abschluss des Vorgangs gedrückt wird.
1. Die Anforderung wird asynchron gesendet
2. Ich habe den Delegaten festgelegt und es funktioniert, solange sich die Ansicht nicht ändert
3. ansehen1 Startet die Operation mit der Eigenschaft "Singleton-Objektreferenz" "OP1Completed"
4. ansehen2 prüft den Abschluss von OP1 über propertyie auf der "Singleton-Objektreferenz"
5. anzeigen2 Ruft das "Ergebnis" ab, indem Sie zur Eigenschaft "singleton.OP1Result" wechseln

Bearbeiten 1:
Ok, lass uns Code haben. Hier ist zunächst der relevante Code meines Singleton (mit dem Namen "Interaction"):

-(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.");
}

Und hier ist die Klasse Util, die die Anfrage / Antwort tatsächlich bearbeitet

-(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();
}

Und zum Schluss hier der relevante Teil VC1 (VC2 einschieben)

- (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];
}

Antworten auf die Frage(5)

Ihre Antwort auf die Frage