アマゾンのAWSのS3に上がっている画像データを読み込み、ScrollViewに表示するというコードを書きました。
UIの更新はdispatch_get_main_queue()の中に明記することを記事で見たので、以下のように記述したのですが、最初の一枚しかscrollviewに追加されません。デバックをしたところ、addImageは画像の枚数回呼び出されているそうです。
複数枚の画像を非同期的に読み込んで、一枚一枚順を追ってscrollviewに追加したいです。複数枚の追加はどうしたらいいでしょうか?
参考
qiita dispatch_async内でUIViewが更新されない
swift
1class LoadViewController: UIViewController,UIScrollViewDelegate { 2 var loadImages:[UIImage] = [] 3 @IBOutlet weak var scrollView: UIScrollView! 4 var uploadRequests = Array<AWSS3TransferManagerUploadRequest?>() 5 var uploadFileURLs = Array<NSURL?>() 6 var downloadRequests = Array<AWSS3TransferManagerDownloadRequest?>() 7 var downloadFileURLs = Array<NSURL?>() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 self.scrollView.delegate = self 12 13 do { 14 try NSFileManager.defaultManager().createDirectoryAtURL( 15 NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("download"), 16 withIntermediateDirectories: true, 17 attributes: nil) 18 } catch let error1 as NSError { 19 error.memory = error1 20 print("Creating 'download' directory failed. Error: \(error)") 21 } 22 23 listObjects() 24 } 25 func addImage(image:UIImage) 26 { 27 let sheight = self.scrollView.frame.height 28 let swidth = self.scrollView.frame.width 29 30 loadImages.append(image) 31 let myImageView = UIImageView() 32 myImageView.frame = CGRectMake(swidth * CGFloat(loadImages.count-1), 0, swidth, sheight) 33 myImageView.image = image 34 scrollView.addSubview(myImageView) 35 scrollView.contentSize = CGSizeMake(swidth * CGFloat(loadImages.count), sheight) 36 37 } 38 func listObjects() { 39 let s3 = AWSS3.defaultS3() 40 41 let listObjectsRequest = AWSS3ListObjectsRequest() 42 listObjectsRequest.bucket = S3BucketName 43 s3.listObjects(listObjectsRequest).continueWithBlock { (task) -> AnyObject! in 44 if let error = task.error { 45 print("listObjects failed: [\(error)]") 46 } 47 if let exception = task.exception { 48 print("listObjects failed: [\(exception)]") 49 } 50 if let listObjectsOutput = task.result as? AWSS3ListObjectsOutput { 51 if let contents = listObjectsOutput.contents as [AWSS3Object]? { 52 for s3Object in contents { 53 let downloadingFileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("download").URLByAppendingPathComponent(s3Object.key!) 54 let downloadingFilePath = downloadingFileURL.path! 55 56 if NSFileManager.defaultManager().fileExistsAtPath(downloadingFilePath) { 57 self.downloadRequests.append(nil) 58 self.downloadFileURLs.append(downloadingFileURL) 59 60 61 } else { 62 let downloadRequest = AWSS3TransferManagerDownloadRequest() 63 downloadRequest.bucket = S3BucketName 64 downloadRequest.key = s3Object.key 65 downloadRequest.downloadingFileURL = downloadingFileURL 66 67 self.downloadRequests.append(downloadRequest) 68 self.downloadFileURLs.append(nil) 69 70 } 71 dispatch_async(dispatch_get_main_queue(), { () -> Void in 72 if let data = NSData(contentsOfURL: downloadingFileURL) { 73 self.addImage(UIImage(data: data)!) 74 self.displayNum++ 75 } 76 }) 77 78 } 79 80 } 81 } 82 return nil 83 } 84 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。