3

HTTP 接続用の独立したクラスを作成しました。すべての接続は正常に機能します。問題は、メソッド「didReceiveData」が接続を呼び出すメソッドの後に呼び出されることです。(メソッド 'didReceiveData' は IBAction 'accept' の後に呼び出されます)


- (IBAction)accept:(id)sender {
    [self connect:url];
    //labelStr = ReturnStr; Cannot be written here. 
}

-(void)connect:(NSString *)strURL
{
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) 
    {
        // receivedData is declared as a method instance elsewhere
        receivedData = [[NSMutableData data] retain];
    } 
    else 
    { 
        // inform the user that the download could not be made
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // append the new data to the receivedData
    [receivedData appendData:data];
    ReturnStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}

これにより、ラベルのテキストを受信した文字列に変更したい場合、コードを IBAction 'accept' に記述できず、メソッド 'didReceiveData' に次のように記述しなければならないという問題が発生します。


    MainViewController *mainView = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
    AMEAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.navController pushViewController:mainView animated:YES];
    mainView.labelStr.text = ReturnStr;

さらに問題は、「didReceiveData」で MainView を初期化すると、MainView のデータが上書きされることです。MainView を初期化せずに labelStr のテキストを変更することはできますか?

4

4 に答える 4

2

問題は、メソッド「didReceiveData」が接続を呼び出すメソッドの後に呼び出されることです。(メソッド 'didReceiveData' は IBAction 'accept' の後に呼び出されます)

接続を作成して接続する前に、接続が送信されることを期待していますconnection:didReceiveData:か?

これにより、ラベルのテキストを受信した文字列に変更したい場合、コードを IBAction 'accept' に記述できず、メソッド 'didReceiveData' に記述しなければならないという問題が発生します...</p>

ほぼ正しいように聞こえます。受け取ったものは、受け取るまで作業できません。

さらに問題は、「didReceiveData」で MainView を初期化すると、MainView のデータが上書きされることです。MainView を初期化せずに labelStr のテキストを変更することはできますか?

connection:didReceiveData:メソッドでメイン ビュー コントローラーとアプリ デリゲートを作成するのは、本当に遅いようです。これらのことを先に行ってからconnection:didReceiveData:、 set 以外は何もしませんlabelStr.text

ところで、connection:didReceiveData:あなたが示すリークの実装ReturnStr。割り当てたものを解放または自動解放することを忘れないでください。

于 2009-03-16T12:33:16.423 に答える
1

データが到着するまでアプリを待機させたい場合は、NSURLConnection のsendSynchronousRequest:returningResponse:error:メソッドを使用します。ただし、このメソッドの実行中はアプリの残りの部分がフリーズすることに注意してください。もちろん、ユーザーの接続が不安定な場合は、メソッドの実行に時間がかかる可能性があります。

于 2009-03-17T12:18:30.243 に答える
0

NSURLConnection およびその他の同様のクラスは、非同期で使用するように設計されています。

initWithRequest:delegate: はすぐに戻り、デリゲート メソッドをデリゲートに送信するまで、接続に悩まされることはありません。

于 2009-03-17T11:59:17.357 に答える
0

NSData の代わりに NSMutableData を使用します。

于 2010-02-22T04:02:53.847 に答える