0

私はサーバーにたくさんのリクエストをします:

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    [theRequest setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; 

     urlData = [[NSMutableData data] retain];
    urlConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];

    if (urlConnection) 
    {
        finishedLoading = FALSE;
        while(!finishedLoading) {
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
    }
    else 
    {
        [delegate swHttpConnection:self withRequest:urlString failedWithError:nil];
    }

...リクエストが完了すると、コールバックが返されます。ただし、以下のコードを使用すると、セレクターは呼び出されません。

- (void)request:(MBRequest *)request finished:(NSMutableArray *)resultArray
{
    //Handle resultArray data 

    [self performSelector:@selector(someRandomFunction) withObject: nil afterDelay:1.0f]; 
}

..しかし、以下のコードを使用する場合; それはうまくいきます:

- (void)request:(MBRequest *)request finished:(NSMutableArray *)resultArray
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) 
    {
        dispatch_async(dispatch_get_main_queue(), ^(void) 
        {
            //Handle resultArray data 

            [self performSelector:@selector(someRandomFunction) withObject: nil afterDelay:1.0f]; 
        }); 
    }); 
}

だから私の質問は2つあります。

  1. これは正しい方法ですか?mainthredでコールバックを強制的に実行する必要がありますか、それともコードのロジックが間違っていますか?

  2. mainthredでコールバックを強制的に実行する必要がある場合、上記のコードは正しいですか?

また、サーバーリクエストコードが次の場所でクラッシュすることがあります。

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

そして、私はこの警告を受け取ります:

Class _NSZombie_NSRunLoop is implemented in both ?? and ?? 

前もって感謝します

4

2 に答える 2

2

NSURLConnectionDelegate方法がないと思いますrequest:finished:か?コードを見ると、MBRequestを使用しているように見えます。もしそうなら、私はあなたが彼らのウェブページ、例えばブロックを使ってこれを行う方法を見る必要があると強く思います。

于 2012-06-02T09:32:36.197 に答える
1

このセグメントのUIを更新すると

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) 
    {
        dispatch_async(dispatch_get_main_queue(), ^(void) 
        {
            //Handle resultArray data 

            [self performSelector:@selector(someRandomFunction) withObject: nil afterDelay:1.0f]; 
        }); 
    }); 

次に、UIスレッドで呼び出す必要があります。そうする必要があります。

于 2012-06-02T09:34:29.197 に答える