IOS で URL ダウンロードのキューイング メカニズムを実装しようとしています。このために、ネットワーク アクセス部分に NSURLConnection を使用し、それらを NSOperationQueue クラス (UIController 間で共有) の静的インスタンスにキューに入れます。ダウンロードが開始したら、NSURLConnectionDownloadDelegate からのコールバックを使用して、UI 進行状況バーを更新します。1 つの UIControllerview、1 つの UIView があります。Queue は ViewLoad で作成され、UIControllerView プロパティとして定義されたポインターに割り当てられます。
//UIControllerView Code
- (void)viewDidLoad
{
[super viewDidLoad];
self.myDownloadQueue = [NSOperationQueue sharedOperationQueue];
}
実装はここの提案に従います
ダウンロードはボタンを介して開始され、新しい NSURLConnection が作成され、SetDelegateQueue を介して NSOperationQueue にディスパッチされます。
- (IBAction)startDownload:(UIButton *)sender {
NSString *url = @"<myURL blablabl>";
NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30];
NSURLConnection *urlConn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
[urlConn setDelegateQueue:self.myDownloadQueue];
[urlConn start];
NSLog(@"adding a new task for url %@",[[urlConn currentRequest] URL ]);
//Sets the UI
self.awProgress1.progress=0;
}
UIViewController は、メソッド用に NSURLConnectionDataDelegate プロトコルを実装します
@interface awViewController : UIViewController <NSURLConnectionDownloadDelegate>
@end
...snip....
@implementation
- (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes
{snip.. updates the progress bar here using performSelectorOnMainThread:@selector()..
}
- (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes{...snip...}
- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL{....snip...}
@end
IOS6 では、コードは正常に動作します。UIViewController が [connection didWriteData:] 呼び出しを受け取ると、UI バーが更新されます。ただし、IOS5 では、URL が完全にダウンロードされると、UI がフリーズします.... ステップ バイ ステップ デバッグは、どちらの場合も、ダウンロードが終了したときにコードが IOS ランタイムに到達することを示しています。つまり、コードのどこかにスタックしていません。ダウンロード中のUIは問題なく、ボタンなどを押すことができます...
メインスレッドで実行するように NSURLCOnnection を設定した場合、つまり削除することにより
[urlConn setDelegateQueue:self.myDownloadQueue];
[urlConn start];
その後、コードは IOS5 で再び機能します。しかし、それは私が望むものではなく、ダウンロードをバックグラウンド スレッドで実行したいのです。
何が欠けていますか?IOS5 でキューに関して行われるいくつかのハウスキーピングはありますか? ダウンロード中のUIは問題ないため、実際にはNSURLConnectionが完了すると問題が発生するようです。ご協力いただきありがとうございます !-
PS: サンプル コードが利用可能ですが、画面が煩雑になりたくないだけです...