iOS dispatch_async und NSURLConnection Delegierten Funktionen nicht aufgerufen

Habe ich bearbeitet diese post, um es einfacher zu Lesen, denke ich.

Muss ich anrufen eine NSUrlConnection, nachdem ich beendet habe, mache ein paar intensive string-manipulation in einem dispatch_async block.

Die URL, die ich aufrufen hat .htaccess-Authentifizierung, so dass ich nicht verwenden können, eine synchrone Verbindung.

Aber die NSURLConnection delegate-Methoden werden nicht aufgerufen. Ich weiß, die URL wird geladen, nach etwa 5 Sekunden in den browser, und getestet hab ich den code mit einem einfachen URL ohne Authentifizierung und es macht keinen Unterschied.

Was hält die delegate-Methoden aufgerufen wird?

Diese Funktion hat einige string-Manipulations-Zeug, und es dauert eine Weile bis Ende:

- (void)performSearch {

    //set some defaults and work out if it is a valid search, setting bSearchOk

    if (bSearchOk) {

        //update some interface elements
        self.msgBox.text = @"Translating...";            
        self.plateInput.enabled = NO;
        self.searchProgress.hidden = NO;

        dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            //create a new search
            Search *oPlateSearch = [[Search alloc] initWithTerm:thisTerm];

            //...
            //perform search... this calls a variety of slow and intensive functions
            //...

            self.aFinalPlates = [oPlateSearch.aValidated copy];
            self.aCurrentPlates = [oPlateSearch.aFinals copy];        

            dispatch_async( dispatch_get_main_queue(), ^{                 
                [oPlateSearch release];              

                //make ajax call to check if plates can be bought
                [self getPrices];                 
            });
        });

    } else {
        //hide results
        self.searchResults.hidden = YES;
    }

}

Ist und rief gegen Ende der block oben

/* call to get plate availability and prices */
-(void) getPrices {
    //set return message
    self.msgBox.text = @"Getting prices and availability";

    //...
    //then I build my strRequest var, which is a valid working URL
    //...

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strRequest]];

    NSURLConnection *loginConnection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

    NSLog('This will get logged');

    if(loginConnection) {
        NSLog('This will also get logged');
        self.jsonSearchResponse = [[[NSMutableData data] retain] autorelease];
        NSLog('And this will get logged, so it's not throwing errors');
    } else {
        NSLog(@"Failed to get search results");
    }
}

Update: ich habe versucht, dies so gut, wie es war eine akzeptierte Antwort auf eine ähnliche Frage, aber es hat nicht funktioniert:

NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[loginConnection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[loginConnection start];

Basierend auf dieser Frage: Warum NSURLConnection delegate-Methoden nicht aufgerufen werden, wenn mit dem global dispatch-queue?

InformationsquelleAutor Pete | 2012-01-20

Schreibe einen Kommentar