【问题标题】:Gif with uiwebview swift带有 uiwebview swift 的 Gif
【发布时间】:2016-09-13 04:35:11
【问题描述】:

我制作了一个UIWebView 来显示一个 gif,我有 2 个按钮登录和注册。

首先,当我运行它时,我的 ram 使用 270mb 然后如果我点击一个按钮转到另一个视图控制器(270mb 停留)然后如果我返回它就像它正在加载另一个 gif 和 ram最高可达 430mb

点击按钮时我已经测试了webview.stoploading()

 override func viewDidLoad() {
    super.viewDidLoad()
let filePath = NSBundle.mainBundle().pathForResource("railway", ofType: "gif")
    let gif = NSData(contentsOfFile: filePath!)
    webview.loadData(gif!, MIMEType: "image/gif", textEncodingName: String(), baseURL: NSURL())
    webview.userInteractionEnabled = false; }



    @IBAction func login(sender: AnyObject) {

    webview.stopLoading()
}

【问题讨论】:

标签: ios swift webview uiwebview gif


【解决方案1】:

尝试使用cache policy:加载您的内容

enum NSURLRequestCachePolicy : UInt {
    case UseProtocolCachePolicy
    case ReloadIgnoringLocalCacheData
    case ReloadIgnoringLocalAndRemoteCacheData
    static var ReloadIgnoringCacheData: NSURLRequestCachePolicy { get }
    case ReturnCacheDataElseLoad
    case ReturnCacheDataDontLoad
    case ReloadRevalidatingCacheData }

所以你的代码可以是:

let filePath = NSBundle.mainBundle().pathForResource("railway", ofType: "gif")
var requestURL = NSURL(string:filePath!);
var request = NSMutableURLRequest(URL: requestURL!,
            cachePolicy: .ReturnCacheDataElseLoad,
            timeoutInterval: 15.0)

webview.loadRequest(request)

你也可以处理 NSURLCache 内存:

override func viewDidLoad() {
    super.viewDidLoad()

    let cacheSizeMemory = 8*1024*1024; // 8MB
    let cacheSizeDisk = 32*1024*1024; // 32MB

    let sharedCache = NSURLCache.init(
        memoryCapacity:cacheSizeMemory,
        diskCapacity:cacheSizeDisk,
        diskPath: "nsurlcache"
    )

    NSURLCache.setSharedURLCache(sharedCache)
}

override func didReceiveMemoryWarning() {
    print("Received memory warning")

    NSURLCache.sharedURLCache().removeAllCachedResponses()

    super.didReceiveMemoryWarning()
}

您可以对您的项目做的另一件事是使用如下代码缓存您的对象:

let cache = NSCache()
let myGiantObject: GiantObjectClass

if let cachedVersion = cache.objectForKey("GiantObjectClassCached") as? GiantObjectClass {
    // use the cached version
    myGiantObject = cachedVersion
} else {
    // create it from the original constructors then store in the cache
    myGiantObject = GiantObjectClass()
    cache.setObject(myObject, forKey: "GiantObjectClassCached")
}

【讨论】:

  • 现在好多了,但如果我移动到另一个视图控制器并返回它会得到双内存现在第一次启动需要 170mb,移动到视图控制器后它会上升到 320mb
  • 它纠正了我从第二个视图控制器返回时遇到的另一个问题,它需要一些时间才能再次加载 gif,但现在不再加载了。 :)
  • 好,“从第二个视图控制器回来”怎么样,你能发布一些关于它的代码吗?继续?弹出视图控制器?解雇..?
  • 所有连接都来自情节提要第一个视图 1 个 web 视图,2 个按钮,登录按钮只需拖放到视图即可与另一个视图控制器连接,为了返回,我有一个带有条形按钮女巫返回的导航栏到第一个视图
  • 我什么都没有测试过,但没有任何改变(可能更糟:P)
【解决方案2】:

好的,我发现了!!!! 当我拖放连接(从登录按钮到登录视图)时,我必须将其设置为推送(我使用 show 设置)现在我使用 97mb 内存,进入登录视图时使用 130mb,返回时使用 97mb。

首先我现在使用视频,但我相信它与问题相同 其次,如果有人想尝试它,他必须使用导航控制器嵌入控制器(如果需要,您可以将栏隐藏到第一个视图),并且您将从按钮拖动到第二个视图并按下(而不是其导航控制器)

【讨论】:

  • Alessandro Ornano 非常感谢您的帮助!
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多