0

私はチャットのようなアプリを持っており、定期的なチャットを受信するには、サーバーを定期的にポーリングしたいと考えています.5分など..新しいメッセージがあるかどうかを確認します.

初心者として、単純な NSURLConnection を試してデータを送受信しましたが、ポーリング中にスタックしました。ポーリングの正しい方法は何ですか? NSTimer を使用して定期的にポーリングする必要がありますか? 私を助けることができるサンプルコードはありますか?

5 秒ごとにバックグラウンド スレッドを呼び出してサーバーにリクエストを送信するメイン スレッドでタイマーを実行しています。何が起こっているのかというと、NSURLConnection のデリゲートが呼び出されていません。何ができるでしょうか?

助けてください。

ありがとう

4

3 に答える 3

1

バックグラウンド スレッドで NSTimer を起動し、定期的にメイン スレッドを呼び出すことができます。これが私のやり方です。

[self performSelectorOnMainThread:@selector(LaunchTimer) withObject:nil waitUntilDone:NO];

特定の間隔で更新関数を呼び出す "LaunchTimer" 関数を作成するだけで、NSURLConnection が呼び出されます。新しいメッセージを受信したら、次のようにメイン スレッドを呼び出してチャット ウィンドウを更新します。

[self performSelectorOnMainThread:@selector(update:) withObject:newMessages waitUntilDone:NO];
于 2012-05-15T23:54:00.270 に答える
1

パトリックの答えから続ける:-デリゲートなしでNSURLConnectionを試すことができれば、

    -(void)update:(id)objmessage
{
    NSString *post =[NSString stringWithFormat:@"timestamp=%@&user_id=%@",DatetimeString,UID];

    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:@"Your server URL"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    NSError *error;
    NSURLResponse *response;
    NSData *returnData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    returnString=[[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding];
    if(!returnString)
    {
        UIAlertView *erroralert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"There is an error getting response" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [erroralert show];
        [erroralert release];
    }
    else 
    {
        NSLog(@"%@",returnString);
    }
    SBJSON *json = [[SBJSON new] autorelease];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:[json objectWithString:returnString error:nil]];
    //NSLog(@"%@",dic);
}
于 2012-05-16T04:10:19.243 に答える
-1

次の方法でこれを解決しました:

[self performSelectorOnMainThread:@selector(performPollinginBackground) withObject:nil   waitUntilDone:NO];

-(void)performPollinginBackground{


//call server task here


}
于 2012-05-16T23:55:31.340 に答える