質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1950閲覧

[swift]非同期通信でのUIScrollViewの更新について

tommy19970714

総合スコア71

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

2クリップ

投稿2016/03/17 15:54

アマゾンの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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、listObjects()をviewDidLayoutSubviewsで呼ぶようにしてみて下さい。(viewDidLoadの時点ではStoryboard上のUIのサイズなどは確定していません。例えばscrollView.frameとか)

swift

1override func viewDidLayoutSubviews() { 2 super.viewDidLayoutSubviews() 3 listObjects() 4}

症状が変わらないようなら、addImageの頭に、

swift

1print("image.frame=\(NSStringFromCGSize(image.size))")

を追加して、画像が正しく(正しいサイズで)読み込まれているかどうかチェックしてみて下さい。

投稿2016/03/18 04:50

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問