真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

戴維營教育原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。我們的夢(mèng)想是做最好的iOS開發(fā)培訓(xùn)!

創(chuàng)新互聯(lián)公司是一家做網(wǎng)站、成都做網(wǎng)站,提供網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,建網(wǎng)站,按需定制網(wǎng)站,網(wǎng)站開發(fā)公司,從2013年開始是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價(jià)值為核心業(yè)務(wù),全程參與項(xiàng)目的網(wǎng)站策劃設(shè)計(jì)制作,前端開發(fā),后臺(tái)程序制作以及后期項(xiàng)目運(yùn)營并提出專業(yè)建議和思路。

介紹

與iOS 9和watchOS 2一起,蘋果引入了一套新的內(nèi)容分發(fā)API,以便節(jié)約設(shè)備空間,這就是按需加載資源。通過使用按需加載資源,我們可以將特定的應(yīng)用程序資源托管在蘋果的服務(wù)器上,然后在需要的時(shí)候進(jìn)行加載。在這個(gè)教程中,我將通過開發(fā)一個(gè)圖片查看應(yīng)用介紹一下按需加載資源的基本用法。

準(zhǔn)備工作

這個(gè)教程需要使用Xcode 7+并且熟悉iOS開發(fā)??梢缘紾ithub上下載初始項(xiàng)目。

1. 按需加載資源
益處

iOS 9和watchOS 2引入按需加載資源的主要目的是減少單個(gè)應(yīng)用程序所占的空間。另外一個(gè)好處是我們的應(yīng)用程序能夠更快的被用戶下載下來并且啟動(dòng)。

通過使用Xcode中的asset pack所唯一分配的tags來獲取按需加載資源。這些資源包可用包含任何asset中的內(nèi)容(圖片、SpriteKit紋理、數(shù)據(jù)等),甚至其它文件如OpenGL和Metal的著色器、SpriteKit和SceneKit的場(chǎng)景文件以及粒子系統(tǒng)。

當(dāng)我們將應(yīng)用提交到App Store時(shí),這些資源也會(huì)被上傳和托管,以便需要的時(shí)候下載。程序運(yùn)行的時(shí)候,只要使用在Xcode中設(shè)置的tag就可以非常方便的獲取到資源。

類別

使用按需加載資源最多的兩個(gè)方面是app bundle,包含可執(zhí)行代碼和重要的資源,例如UI圖標(biāo)和asset packs。

在Xcode中可以將這些資源分為三個(gè)主要的類別:

  • 初始安裝: 第一次運(yùn)行需要的內(nèi)容,過后可以刪除。一般可以包含游戲的開始幾關(guān),當(dāng)游戲進(jìn)度足夠遠(yuǎn)的時(shí)候就可以刪除了。

  • 預(yù)取: 這個(gè)類別的內(nèi)容在安裝完應(yīng)用后就需要立即下載。這個(gè)類型的數(shù)據(jù)應(yīng)該應(yīng)用在那些非必需的資源上,但是如果安裝了可以獲取更好的用戶體驗(yàn)。比如游戲的新手教程。

  • 按需加載: 在程序運(yùn)行過程中下載,不會(huì)影響程序的運(yùn)行。這是我們使用最多的按需加載類型。

限制

支持按需加載資源的應(yīng)用程序需要遵循以下限制:

  • iOS應(yīng)用程序不能超過2GB

  • 初始安裝的tag不能超過2GB

  • 預(yù)取tag不能超過2GB

  • 正在使用的資源不能超過2GB。這一點(diǎn)只有當(dāng)應(yīng)用正在運(yùn)行并且使用了按需加載資源的時(shí)候才起作用。

  • 每個(gè)asset pack不能給你超過512MB。如果超過了這個(gè)限制,Xcode將給出警告并且允許我們繼續(xù)測(cè)試和開發(fā)程序,但是提交到App Store時(shí)會(huì)失敗。

  • 蘋果為每個(gè)應(yīng)用提供最多20GB的空間進(jìn)行托管,這也是每個(gè)程序一次最多可以下載的資源數(shù)量。當(dāng)然,應(yīng)用程序一次最多只能使用2GB的資源。

應(yīng)用分片

注意20GB的限制是所有應(yīng)用程序分片的總和,而是總共20GB。那什么是應(yīng)用程序分片呢?應(yīng)用程序分片是iOS 9引入的,用于降低應(yīng)用大小的一個(gè)特性。當(dāng)應(yīng)用被安裝后,它只會(huì)查找與設(shè)備對(duì)應(yīng)的資源。例如,當(dāng)資源被正確使用的時(shí)候,iPhone 6 Plus或6s Plus只會(huì)加載3x的圖標(biāo),而不會(huì)下載1x和2x的。所以整個(gè)按需加載資源的總的大小是20GB,包含我們上傳到App Store服務(wù)器的所有設(shè)備類型需要的資源總和。除此以外其它限制條件都是針對(duì)特定的設(shè)備類型單獨(dú)設(shè)置的。

刪除按需加載資源

已經(jīng)下載的按需加載資源只有當(dāng)設(shè)備空間不夠時(shí)才會(huì)被清理。當(dāng)空間不夠時(shí),按需加載資源系統(tǒng)會(huì)查看設(shè)備上的所有應(yīng)用,并且根據(jù)資源的最后使用時(shí)間決定刪除哪個(gè)。如果應(yīng)用程序正在運(yùn)行,它擁有的資源永遠(yuǎn)都不會(huì)被清理。

2. 分配和指定Tag

使用Xcode打開啟動(dòng)項(xiàng)目并且在模擬器中運(yùn)行程序。它包含一組圖片,由三種顏色(紅、綠、藍(lán))和四種形狀(圓、正方形、星形和六邊形)組合而成。當(dāng)程序運(yùn)行的時(shí)候,選擇Colors > Red,我們可以看到一個(gè)紅色的圓。

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

我們?cè)诔绦蛑性O(shè)置7個(gè)asset pack,每個(gè)包含一種顏色和一個(gè)形狀。按需請(qǐng)求資源的另外一個(gè)特性是每個(gè)資源可以設(shè)置多個(gè)Tag。比如紅色的圓可以同時(shí)是RedCircle包的一部分。

按需請(qǐng)求資源API對(duì)同一個(gè)資源不會(huì)下載兩次。換句話說,就是如果已經(jīng)下載Red包,那么在下載Circle包的時(shí)候,不會(huì)再次下載紅色圓形這個(gè)圖片。

在Xcode中,打開Assets.xcassets。我們可以看到12張圖片。

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

下一步,選擇藍(lán)色方塊圖片集,并且打開Attributes Inspector。

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

Attributes Inspector中包含一個(gè)新的On Demand Resource Tags組,可以用來設(shè)置資源的標(biāo)簽(Tag)。我們給藍(lán)色方塊設(shè)置BlueSquare標(biāo)簽。

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

設(shè)置好資源的Tag后,打開Xcode左側(cè)的Project Navigator,點(diǎn)擊Resource Tags標(biāo)簽并且選擇Prefetched進(jìn)行過濾。

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

我們可以非常方便的看到每個(gè)資源包的大小以及里面所包含的內(nèi)容。Prefetched中顯示每個(gè)類別中的資源,并且允許在不同的類別中進(jìn)行移動(dòng):

  • 初始安裝

  • 預(yù)取

  • 按需下載

這正是我之前所提到的三個(gè)類別。Prefetched Tag Order組中的資源在顯示的時(shí)候自動(dòng)開始下載。

設(shè)置好了所有的圖片資源后,就可以開始訪問這些內(nèi)容了。

3. 訪問按需請(qǐng)求資源

我們使用NSBundleResourceRequest獲取App Store服務(wù)器托管的資源包。使用需要獲取的資源的Tag創(chuàng)建request對(duì)象。它會(huì)告訴系統(tǒng)我們所需要使用的資源包是哪個(gè)。而釋放這些對(duì)象則告訴系統(tǒng)我們不再需要這些資源包了。一定要注意不能超過2GB的資源限制。

在項(xiàng)目中,打開DetailViewController.swift并且在DetailViewController中添加一下屬性。

var request: NSBundleResourceRequest!

下一步,替換viewDidAppear(_:)方法。

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    request = NSBundleResourceRequest(tags: [tagToLoad])
    request.beginAccessingResourcesWithCompletionHandler { (error: NSError?) -> Void in
        //  Called on background thread
        if error == nil {
            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                self.displayImages()
            })
        }
    }}

剛才的代碼中我們用Tag初始化了一個(gè)request對(duì)象。tagToLoad屬性是在前一個(gè)頁面設(shè)置的,表示我們要顯示的內(nèi)容是什么。

下一步,我們通過調(diào)用beginAccessingResourcesWithCompletionHandler(_:)開始下載特定Tag標(biāo)明的資源包。這個(gè)方法自動(dòng)訪問Tag對(duì)應(yīng)的所有資源,并且開始下載。一旦獲取到資源后,其它代碼一切照舊。

注意,如果我們只希望訪問已經(jīng)下載的資源,而不想繼續(xù)加重內(nèi)容。可以調(diào)用conditionallyBeginAccessingResourcesWithCompletionHandler(_:)。

需要提醒的是,上面方法的執(zhí)行完后,handler是在子線程中執(zhí)行的,因此需要切換到主線程再更新UI。

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

我們已經(jīng)成功的在程序里使用了按需加載資源,簡(jiǎn)單吧!

Xcode 7的有一個(gè)重要的調(diào)試特性就是能夠查看當(dāng)前下載了那些資源包。點(diǎn)開Debug Navigator并且選擇Disk就可以看到了。

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介

我們可以改變一下資源的下載優(yōu)先級(jí),這樣有些內(nèi)容就會(huì)總是立馬下載。同時(shí)還可以改變資源的保存優(yōu)先級(jí),比如HexagonStar會(huì)在CircleSquare之前清理。將代碼改成一下樣子:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    request = NSBundleResourceRequest(tags: [tagToLoad])

    request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent
    NSBundle.mainBundle().setPreservationPriority(1.0, forTags: ["Circle", "Square"])
    NSBundle.mainBundle().setPreservationPriority(0.5, forTags: ["Hexagon", "Star"])

    request.beginAccessingResourcesWithCompletionHandler { (error: NSError?) -> Void in
        //  Called on background thread
        if error == nil {
            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                self.displayImages()
            })
        }
    }}

初始化request對(duì)象后,我們可以設(shè)置loadingPriority屬性為NSBundleResourceRequestLoadingPriorityUrgent。當(dāng)然,也可以設(shè)置0-1之間的任意值來表明加載優(yōu)先級(jí)。

這個(gè)常量自動(dòng)設(shè)置請(qǐng)求為最高加載優(yōu)先級(jí),但是這取決于當(dāng)前的CPU活動(dòng)情況。在某些情況下,如果CPU任務(wù)繁忙,資源的下載可能會(huì)被推遲。

下一步我們通過mainBundle的setPreservationPriority(_:forTags:)設(shè)置四個(gè)形狀的保存優(yōu)先級(jí)。這時(shí)我們就可以確認(rèn),一旦按需加載系統(tǒng)需要清理一些資源的時(shí)候,就會(huì)先刪除HexagonStar。

4. 最佳實(shí)踐

現(xiàn)在我們知道了如何在iOS應(yīng)用里使用按需加載資源。下面我想給大家介紹一些需要注意的地方。

讓每個(gè)Tag保持最小

為了減少資源的加載時(shí)間,使得每個(gè)資源更容易訪問,應(yīng)該讓每個(gè)資源包保持盡可能的小。這樣就不會(huì)導(dǎo)致被過度清理。

例如,系統(tǒng)本身需要釋放50MB的空間,但是如果最合適被刪除的包是400MB,這樣就會(huì)導(dǎo)致350MB的內(nèi)容被不必要的刪除。這就意味著下次需要的時(shí)候又要多下350MB。建議每個(gè)資源包的大小應(yīng)該接近64MB。

提前下載資源

如果你的應(yīng)用有一個(gè)非常容易預(yù)見的用戶操作過程,最好是提前就開始下載資源。這樣可以提高用戶體驗(yàn),而不需要他們等待太久。

游戲是一個(gè)非常常見的場(chǎng)景。如果一個(gè)玩家已經(jīng)完成了前5關(guān),我們最好在他玩第6關(guān)的時(shí)候,開始下載第7關(guān)。

正確的停止對(duì)資源的訪問

如果不在需要訪問某個(gè)資源包,確保釋放NSBundleResourceRequest對(duì)象或者調(diào)用endAccessingResources方法。

這樣不僅可以防止我們的應(yīng)用達(dá)到2GB的限制,而且可以幫助系統(tǒng)知道什么時(shí)候需要訪問這些資源,從而更好的決定如何刪除資源來獲取更多空間。

5. tvOS上的按需訪問資源

在我的另外一篇關(guān)于tvOS的博客提到tvOS的應(yīng)用限制。比如最大程序大小為200MB,因此更應(yīng)該使用按需方法資源。

tvOS和iOS的按需訪問資源的其它限制是一樣的,只是要注意tvOS僅使用1x的圖片,因此并不會(huì)因?yàn)閼?yīng)用程序分片的存在而減少空間。

總結(jié)

iOS 9和tvOS上的按需加載資源是用來減少程序大小和提供更好用戶體驗(yàn)的一個(gè)非常重要的方法。它非常容易使用和設(shè)置,但是要注意它的加載時(shí)間和數(shù)據(jù)清理所帶來的一些問題。

戴維營學(xué)院(高級(jí)開發(fā)視頻): http://v.diveinedu.com

潛心俱樂部(iOS面試必備): http://divein.club

Ios和tvos按需請(qǐng)求資源簡(jiǎn)介


分享文章:Ios和tvos按需請(qǐng)求資源簡(jiǎn)介
分享網(wǎng)址:http://weahome.cn/article/pccjdo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部