前提・実現したいこと
iOSアプリを作成してます。
一定間隔でAPI通信をしてその結果によってアニメーションGIFを切り替えたり、
画面遷移をさせたりしたいです。
実装してみたのですが、アニメーションGIFの切り替え部分で
メモリー関連のエラーが発生してしまいうまく動作しません。
お力を貸してください。
<追記>
TsukubaDepotさまにご連絡いただいた過去の問を参考にして、GIFファイルを圧縮して試してみましたが、
NGでしたので、別のライブラリを使用することも検討していこうと思います。
発生している問題・エラーメッセージ
Message from debugger: Terminated due to memory issue
該当のソースコード
swift
1import UIKit 2import SwiftGifOrigin 3 4class ViewController: UIViewController { 5 6 var timer: Timer! 7 var dispatch = DispatchGroup() 8 var alert = UIAlertController() 9 10 var imgGif = UIImageView(image: UIImage.gif(name: "confirm_0")) 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 // 画面サイズを取得 16 let iWidthScreen = self.view.frame.size.width 17 let iHeightScreen = self.view.frame.size.height 18 19 // アニメーションGIF 20 imgGif.image = imgConfRadioWave 21 imgGif.frame = CGRect(x: 15, y: 15, width: 150, height: 150) 22 self.view.addSubview(imgGif) 23 24 // 30秒ごとにAPI通信 25 timer = Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(regularExec), userInfo: nil, repeats: true) 26 } 27 28 override func viewDidAppear(_ animated: Bool) { 29 dispatch = DispatchGroup() 30 dispatch.enter() 31 } 32 33 // API処理(30秒ごと) 34 @objc func regularExec() { 35 36 let sParam = "count=1" 37 let sData = sParam.data(using: String.Encoding.utf8) 38 39 let urlString = "https://XXX.XX.XX" 40 41 var sRes = "" 42 var iCnt = 0 43 if let url = URL(string: urlString) { 44 45 let req = NSMutableURLRequest(url: url) 46 req.httpMethod = "POST" 47 req.httpBody = sData 48 let task = URLSession.shared.dataTask(with: req as URLRequest) { data, resp, err in 49 50 do { 51 let json:NSArray = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 52 let aData = json[0] as! Dictionary<String, AnyObject> 53 54 sRes = aData["result"] as! String 55 iCnt = Int(aData["count"] as! String)! 56 self.dispatch.leave() 57 } 58 } 59 task.resume() 60 61 // task終了後処理 62 self.dispatch.notify(queue: .main) { 63 if (sRes == "0") { 64 // 回数に応じてGIFアニメを切り替え 65 switch (iCnt) { 66 case 1: 67 self.imgConfRadioWave = UIImage.gif(name: "confirm_1") 68 self.imgViewConfRadioWave.image = self.imgConfRadioWave 69 break; 70 case 2: 71 self.imgConfRadioWave = UIImage.gif(name: "confirm_2") 72 self.imgViewConfRadioWave.image = self.imgConfRadioWave 73 break; 74 case 3: 75 self.imgConfRadioWave = UIImage.gif(name: "confirm_3") 76 self.imgViewConfRadioWave.image = self.imgConfRadioWave 77 break; 78 default: 79 break; 80 } 81 self.dispatch = DispatchGroup() 82 self.dispatch.enter() 83 } else { 84 self.timer.invalidate() 85 if (sRes == "1") { 86 // 画面遷移 87 let nextView = NextViewController() 88 self.present(nextView, animated: true, completion: nil) 89 } 90 } 91 } 92 } 93 } 94} 95※エラー処理等は割愛しています
補足情報(FW/ツールのバージョンなど)
MacOS HighSieera
Xcode 10.1
Swift 3.1
回答1件
あなたの回答
tips
プレビュー