2

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: サンプル コードが利用可能ですが、画面が煩雑になりたくないだけです...

4

0 に答える 0