読みやすくするためにこの投稿を編集したと思います。
dispatch_asyncブロックで集中的な文字列操作を実行し終えたら、NSUrlConnectionを呼び出す必要があります。
私が呼び出すURLには.htaccess認証が含まれているため、同期接続を使用できません。
ただし、NSURLConnectionデリゲートメソッドは呼び出されていません。ブラウザで約5秒後にURLが読み込まれることはわかっていますが、認証なしの単純なURLでコードをテストしましたが、違いはありません。
呼び出されているデリゲートメソッドを停止するのは何ですか?
この関数はいくつかの文字列操作を行い、完了するまでに時間がかかります。
- (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;
}
}
そして、これは上のブロックの終わりに向かって呼び出されたものです
/* 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");
}
}
更新:別の同様の質問に対する回答として受け入れられたので、これも試しましたが、機能しませんでした:
NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[loginConnection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[loginConnection start];
この質問に基づく:グローバルディスパッチキューを使用しているときに、NSURLConnectionデリゲートメソッドが呼び出されないのはなぜですか?