3

読みやすくするためにこの投稿を編集したと思います。

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デリゲートメソッドが呼び出されないのはなぜですか?

4

3 に答える 3

4

iphonedevsdk.comフォーラムの誰かが私のためにこれに答えました:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/97415-dispatch_async-nsurlconnection.html

答えは使用することでした:

 [self performSelectorOnMainThread:@selector(getPrices) withObject:Nil waitUntilDone:NO];
于 2012-01-27T14:09:27.590 に答える
4

NSURLConnectionでの使用方法とdispatch_async構成方法を示すSO投稿を開始しましたNSRunLoop

セマフォで実装されたNSURLConnectionブロッキングラッパー

興味のあるコードは次のとおりです。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [NSURLConnection connectionWithRequest:request delegate:self];

    while(!self.finished) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
});

で、YESconnectionDidFinishLoadingに設定します。finished

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    self.finish = YES;
}
于 2012-12-05T22:27:30.267 に答える
0

接続を自動解放し、参照を保持していないため、メモリが不足していると思います。自動解放呼び出しを削除して、問題が解消されるかどうかを確認します。もしそうなら、それが終わったときに接続を解放する方法を見つけて、それが漏れないようにしてください。

于 2012-01-20T12:33:02.790 に答える