3

誰かが私を助けてくれないかと思っていました。画像の URL をテキストフィールドに入力すると、NSURLSessionDownloadTask を使用して UIImageView に画像を表示しようとしています。

-(IBAction)go:(id)sender { 
     NSString* str=_urlTxt.text;
     NSURL* URL = [NSURL URLWithString:str];
     NSURLRequest* req = [NSURLRequest requestWithURL:url];
     NSURLSession* session = [NSURLSession sharedSession];
     NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithRequest:request];
}

この後どこに行けばいいのかわからない。

4

1 に答える 1

7

2 つのオプション:

  1. を使用[NSURLSession sharedSession]し、 を で表現downloadTaskWithRequestcompletionHandlerます。例えば:

    typeof(self) __weak weakSelf = self; // don't have the download retain this view controller
    
    NSURLSessionTask* downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
    
        // if error, handle it and quit
    
        if (error) {
            NSLog(@"downloadTaskWithRequest failed: %@", error);
            return;
        }
    
        // if ok, move file
    
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSURL *documentsURL = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0];
        NSURL *fileURL = [documentsURL URLByAppendingPathComponent:filename];
        NSError *moveError;
        if (![fileManager moveItemAtURL:location toURL:fileURL error:&moveError]) {
            NSLog(@"moveItemAtURL failed: %@", moveError);
            return;
        }
    
        // create image and show it im image view (on main queue)
    
        UIImage *image = [UIImage imageWithContentsOfFile:[fileURL path]];
        if (image) {
            dispatch_async(dispatch_get_main_queue(), ^{
                weakSelf.imageView.image = image;
            });
        }
    }];
    [downloadTask resume];
    

    明らかに、ダウンロードしたファイルでやりたいことは何でもできます (必要に応じて別の場所に置きます) が、これが基本的なパターンかもしれません

  2. NSURLSessionを使用して作成session:delegate:queue:および指定し、そこでダウンロードの完了にdelegate準拠して処理します。NSURLSessionDownloadDelegate

前者の方が簡単ですが、後者の方がリッチです (たとえば、認証、リダイレクトの検出などの特別なデリゲート メソッドが必要な場合や、バックグラウンド セッションを使用する場合に役立ちます)。

忘れないでください。そうしない[downloadTask resume]と、ダウンロードが開始されません。

于 2014-11-10T20:45:10.477 に答える