私はリアルタイムでユーザー入力に関する検証を実行するWebサービスコールを持っています。 (iOS 5で導入された)検証に[NSURLConnection sendAsynchronousRequest]
を使用したいが、ユーザが入力フィールドの内容をその間に変更した場合はキャンセルする。現在のリクエストをキャンセルする最良の方法は何ですか?NSURLConnection sendAsynchronousRequestを使用して非同期呼び出しをキャンセルするにはどうすればよいですか?
答えて
これを行う良い方法はないようです。要求をキャンセルする必要がある状況では、解決策は新しい[NSURLConnection sendAsynchronousRequest]
を使用しないように思われます。私は次のように、別々のDownloadWrapper
クラスでsendAsynchronousRequestメソッドを置くことによって、これを行うことができた
:
//
// DownloadWrapper.h
//
// Created by Ahmed Khalaf on 16/12/11.
// Copyright (c) 2011 arkuana. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol DownloadWrapperDelegate
- (void)receivedData:(NSData *)data;
- (void)emptyReply;
- (void)timedOut;
- (void)downloadError:(NSError *)error;
@end
@interface DownloadWrapper : NSObject {
id<DownloadWrapperDelegate> delegate;
}
@property(nonatomic, retain) id<DownloadWrapperDelegate> delegate;
- (void)downloadContentsOfURL:(NSString *)urlString;
@end
@implementation DownloadWrapper
@synthesize delegate;
- (void)downloadContentsOfURL:(NSString *)urlString
{
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil)
[delegate receivedData:data];
else if ([data length] == 0 && error == nil)
[delegate emptyReply];
else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
[delegate timedOut];
else if (error != nil)
[delegate downloadError:error];
}];
}
@end
このクラスを利用するためには、私は(DownloadWrapper *downloadWrapper
変数を宣言することに加えて、次の操作を行いインタフェース宣言内)および応答、または1つの欠如処理プロトコル実装方法:次に
NSString *urlString = @"http://yoursite.com/page/to/download.html";
downloadWrapper = [DownloadWrapper alloc];
downloadWrapper.delegate = self;
[downloadWrapper downloadContentsOfURL:urlString];
をI単にビュージしようとするとき、接続を「キャンセル」に次の手順を実行しサッピア:
- (void)viewDidUnload
{
[super viewDidUnload];
downloadWrapper = nil;
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[downloadWrapper setDelegate:nil];
}
これは簡単です。これがうまくいけば、それは次のことを行いと述べている文書cancel
方法、模倣する:このメソッドが呼び出されると
を、受信機のデリゲートは、もはや このNSURLConnectionのために任意のメッセージを受信しません。
私はこの(やや素朴な)方法は、URLリクエストに応じてデータパケットが引き続き送信されることを意味していました。私たちはもはやデリゲートとしてリッスンしません。しかし、URLリクエストが送信されると、応答が私たちに返って来るのを止める方法がないことに気付きました。私たちはそれを無視することができます(このレベルではない場合でも、ネットワーク階層の下位レベルであっても) 。私が間違っているなら、私を修正してください。
いずれにしても、これが役立ちます。
このソリューションで私が持っている1つの問題は、一度に1つの代理人しか持つことができないということです。 sendAsynchronousRequest:queue:completionHandler:のメリットの1つは、さまざまなオブジェクトからの多数の要求でそれを砲撃することができることです。ラッパーデリゲートが生きているが、元のリクエストオブジェクトがクラッシュしていない場合。これは私がグローバルAPIClientでこのメソッドを使用しようとしたときの問題でした。 私はMicahに同意しますが、これは簡単な実装のための実行可能な解決策になります。 – GnarlyDog
あなたはそうです、それは私が必要としていたものであっても、あまりにも単純すぎました。私はその後、私のアプローチを変更し、代わりにNick Lockwoodの[RequestQueue](https://github.com/nicklockwood/RequestQueue)クラスを利用しました。すべての(並行して)要求を取り消すか、必要に応じて特定の要求を取り消す方法があります。 – pxlshpr
- 1. 非同期NSURLConnectionとNSOperation - キャンセル
- 2. 条件によって非同期にサービスメソッドを呼び出すにはどうすればよいですか?
- 3. CancellationTokenSourceをDownloadStringTaskAsyncメソッドに添付して非同期呼び出しをキャンセルするにはどうすればよいですか?
- 4. 非同期に非同期デリゲートを呼び出しますか?
- 5. 非同期ライブラリから非同期呼び出しを行う?
- 6. voidを返すWebサービスの非同期メソッドを呼び出すにはどうすればよいですか?
- 7. jQuery.Deferredオブジェクトを使用して非同期関数呼び出しが完了するまで待機するにはどうすればよいですか?
- 8. コールバックで複数の非同期非同期呼び出しからのデータを操作するにはどうすればよいですか?
- 9. 非同期メソッドを使用してXigniteを呼び出す
- 10. 非同期メソッド呼び出しを使用してif条件のセットをDictionaryに変換するにはどうすればよいですか?
- 11. ES6:非同期呼び出しでジェネレータを使用する
- 12. 1つの非同期関数をグループで呼び出すにはどうすればよいですか?
- 13. asp.net C#4.0で非同期メソッドを呼び出すにはどうすればよいですか?
- 14. 非定型パラメータを使用してストアドプロシージャを呼び出すにはどうすればよいですか?
- 15. 別スレッドの非同期NSURLConnectionがデリゲートメソッドの呼び出しに失敗する
- 16. 非同期メソッド(Web呼び出しを行う)を非同期にラップする
- 17. NSURLConnectionを使用した非同期ダウンロードキュー
- 18. 同期呼び出しを非同期にするときにTaskStatusを返すにはどうすればよいですか?
- 19. 非同期呼び出しから非同期呼び出しに例外をスローする
- 20. 非同期呼び出しで同期関数をラップする#
- 21. これは単純な非同期呼び出しを非同期にしていますか?
- 22. 非同期呼び出しを持つJavascript関数を正しく使用するにはどうすればよいですか?
- 23. 非同期タスクを使用してファイルをサーバーにアップロードするにはどうすればよいですか?
- 24. 非同期呼び出し
- 25. 非同期呼び出しに反応する際にAPIを使用するにはどうすればよいですか?
- 26. 複数の観測可能な呼び出しを非同期的に呼び出すにはどうすればよいですか?
- 27. C#EndInvokeを使用しない非同期呼び出し?
- 28. 非同期GAコードを使用してフラッシュイベントを追跡するにはどうすればよいですか?
- 29. パラメータを使用した非同期呼び出しの呼び出し方法
- 30. componentDidMountで非同期呼び出しによって作成されたコンポーネントをテストするにはどうすればよいですか?
これは正しくありません。 [私のポストは、以下を参照してください(http://stackoverflow.com/a/25784367/1255674)。 – Robert