2

私は、非同期のHTTP要求に非常に奇妙な問題を抱えている:Objective Cの - 非同期HTTP要求ブロックプログラム

私は10秒で、それを遅延し、応答を送信し、サーバに要求を送信します。

プログラムをブロックしないために、私は非同期で行います。 (NSThreadを介して)メソッドを呼び出すだけであれば、動作しません。私はそれが終了する前にスレッドが死んでいると仮定します(サーバーは10秒間待機します)。 メソッドを呼び出してCFRunLoopRun()を使用すると、実際には動作しますが、プログラム全体が10秒間動作を停止します。 私の質問は、スレッドを十分な時間だけ稼働させ、プログラムの実行をブロックしないようにする方法です。 もちろん、私は自分のコードに間違いがあり、そのすべてを引き起こすオプションがあるので、関連するすべての部分を公開します。

これはメインスレッドである:

self.MessagesList=[[MessagesArray alloc] init]; 
[NSThread detachNewThreadSelector:@selector(backgroundMethod) toTarget:self withObject:nil]; 

-(void)backgroundMethod 
{  
    [self.MessagesList updateFromServer]; 
     CFRunLoopRun();  //the method dies without this line 
} 

、これは要求である:

-(void)updateFromServer{ 
    NSLog(@"method called"); 
    responseData = [NSMutableData data]; 
    NSURLRequest *request = 
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8000/messages/views/new_messages/"]]; 
    NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request  delegate:self]; 
    if(!connection) { 
     NSLog(@"connection failed :("); 
    } else { 
     NSLog(@"connection succeeded :)"); 
    } 
} 

responseDataは、以下のように定義されている間:

@property (nonatomic,strong) NSMutableData *responseData; 

Iはまた、代わりperformSelectorInBackgroundを試しNSThreadのうちのどれかを使わずにupdateFromServerを呼び出しても、その結果同じ。

私はARCと一緒に作業しています - おそらくそれと関係がありますか?

私は本当にそれを解決しなければならないし、方法がわからないので、あなたが私を助けてくれれば嬉しいです。

おかげ

+0

なぜスレッドを使用していますか? NSURLConnection'を非同期的に使用するスレッドは必要ありません –

+0

何をお勧めしますか? updateFromServerをそのまま呼び出してみましたが、何も変更されていません。要求が非同期でない可能性がありますか? –

+0

多分あなたは 'updateFromServer'でブロックしている何か他のことをしています - ここからはわかりません –

答えて

1

非同期要求で任意のスレッドを使用する必要はありません。必要なすべてのデリゲートメソッドを持つデリゲートがあることを確認してください。

runloopを呼び出すのは危険です。応答する代わりに質問する場合は、CFRunLoopRun()を呼び出しないでください。

実際に接続を開始するコードはありません。コードで何も起こりません。サーバーに何かを送信したり、サーバーから何かを受け取ったりすることは決してありません。

ARCはこれとは関係ありません。 ARCは、http接続が不思議に動作しないようにするものではありません。

関連する問題