2017-03-29 12 views
0

まず、この質問は既に存在するとは思わないが、同様の投稿があると私は同意する。彼の "接続"状態でNSUrlConnectionを中止する

私の質問は、どのように彼の "接続中"状態でNSUrlConnectionを中止するのですか?接続が確立したら、NSUrlConnection cancelメソッドを使用してリクエストをキャンセルできます。しかし、サーバーが応答を提供しない(デリゲート呼び出しを受信する前に)タイムアウトに達する前に、 "接続"状態でどのように中断しますか?

ありがとうございました!

EDIT

は、私が(そのメソッドcancelで)それを行うためにNSURLSession​Taskの代わりNSUrlConnectionを使用する必要がありますか?

EDIT 2 - コードサンプル、私はデータをストリーミングするために私の接続を使用し

NSURLConnection* m_connection; 
m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
if(m_connection){ 
    [m_connection start]; 

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX 
               target: self selector: @selector(doNothing:) 
              userInfo: nil repeats:YES]; 
    m_runLoop = [NSRunLoop currentRunLoop]; 
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode]; 
    while (m_bRunLoop && [m_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

    [m_connection cancel]; 
} 

。ご覧のとおり、今のところ私は接続設定m_bRunLoopfalseに打ち切りました。これは問題ありません。しかし、私の質問は:どのようにサーバーが応答を送信する前に、完全なタイムアウトを待たずに私の接続を中断する?

+0

あなたは 'NSURLConnection'インスタンスを作成する場所にコードを投稿できますか?キャンセルする場所は同じクラスか別のクラスですか? –

+0

投稿を編集したり、別のクラスを編集したりしても問題はありません。 – N0un

答えて

1

[NSURLConnection cancel]に接続しても接続をキャンセルし、それ以降の代理通話はできません。再接続する場合は、新しい接続オブジェクトを作成する必要があることに注意してください。あなたの質問から、むしろあなたがどのように問題を抱えているのかを推測して、どのように委任を受ける前にこの電話をcancelコールに呼び出すのですか?

さらに、ほとんどの場合、ネットワークを処理するためのより良い方法であるため、データタスクでNSURLSession APIを使用することを検討してください。

EDIT(あなたがコードを追加して):すべての

まず、NSTimerは、実行ループの入力ソースとして考慮されていないとして、あなたの実行ループにタイマーを追加すると、ここには何も変更しないことに注意してください(もしあなたは本当に「何もしない」)。

2番目 - m_bRunLoopをfalseに設定すると、コードを提供しなくてもどこかで行うことができますが、これが接続をキャンセルする場所になりますので、この場所を "cancelConnection"メソッドという名前にします。

次のようにコードを変更します。

m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
if(m_connection){ 
    yourConnectionThread = [NSThread currentThread]; // store your thread in instance variable 
    [m_connection start]; 

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX 
               target: self selector: @selector(doNothing:) 
              userInfo: nil repeats:YES]; 
    m_runLoop = [NSRunLoop currentRunLoop]; 
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode]; 

} 

を、あなたが接続を解除する方法を実装して、あなたが接続を開始されたスレッド上でキャンセルを呼び出す必要があることを忘れないでください:

- (void)cancelConnection { 
    //m_bRunLoop = false <- this was before here 
    [m_connection performSelector:@selector(cancel) onThread:yourConnectionThread withObject:nil waitUntilDone:YES]; 

} 

最後に、 NSRunLoopはスレッドセーフではなく、別のスレッドからメソッドを呼び出すべきではないことに注意してください。

+0

はい、私の問題は、デリゲートコールを受信する前にキャンセルすることです。 – N0un

+0

これはコードアーキテクチャーの問題です。高速パッチとして、リクエストを実行するクラスの 'NSDictionary'インスタンス変数で開始されたすべての' NSURLConnections'を保存することができます。また、接続をキャンセルするための正しい場所と時刻にあるときは、辞書から正しいものを選択して呼び出しますそれに対して 'cancel'を実行します。 –

+0

さて、アーキテクチャーについて言えば、私はいくつかの初期化を行ってから(ストリームデータ用に)接続を開始する 'NSThread'を持っています。なぜなら、問題は私が実行する必要があるのでいつでも中断できます。このスレッドで "join"して、タイムアウトに達するのを待っていません。 – N0un

関連する問題