與sdwebimage異步加載網絡圖檔的功能相似,隻是代碼比較簡單,功能沒有sd的完善與強大,支援預設添加圖檔,支援本地緩存。
異步加載圖檔的核心代碼如下:
<a href="http://my.oschina.net/u/2340880/blog/470901#">?</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<code> </code><code>func setzyhwebimage(url:nsstring?, defaultimage:nsstring?, iscache:bool){</code>
<code> </code><code>var zyhimage:uiimage?</code>
<code> </code><code>if</code> <code>url == nil {</code>
<code> </code><code>return</code>
<code> </code><code>}</code>
<code> </code><code>//</code><code>設定預設圖檔</code>
<code> </code><code>if</code> <code>defaultimage != nil {</code>
<code> </code><code>self.image=uiimage(named: defaultimage!)</code>
<code> </code><code>//</code><code>是否進行緩存處理</code>
<code> </code><code>if</code> <code>iscache {</code>
<code> </code><code>//</code><code>緩存管理類</code>
<code> </code><code>var data:nsdata?=zyhwebimagechchecenter.readcachefromurl(url!)</code>
<code> </code><code>if</code> <code>data != nil {</code>
<code> </code><code>zyhimage=uiimage(data: data!)</code>
<code> </code><code>self.image=zyhimage</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>//</code><code>擷取異步線程</code>
<code> </code><code>var dispath=dispatch_get_global_queue(dispatch_queue_priority_high, 0)</code>
<code> </code><code>dispatch_async(dispath, { () -> void </code><code>in</code>
<code> </code><code>var url:nsurl = nsurl(string: url!)!</code>
<code> </code><code>var data:nsdata?=nsdata(contentsofurl: url)</code>
<code> </code><code>if</code> <code>data != nil {</code>
<code> </code><code>zyhimage=uiimage(data: data!)</code>
<code> </code><code>//</code><code>寫緩存</code>
<code> </code><code>zyhwebimagechchecenter.writecachetourl(url!, data: data!)</code>
<code> </code><code>//</code><code>主線程中重新整理ui</code>
<code> </code><code>dispatch_async(dispatch_get_main_queue(), { () -> void </code><code>in</code>
<code> </code><code>//</code><code>重新整理主ui</code>
<code> </code><code>self.image=zyhimage</code>
<code> </code><code>})</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>})</code>
<code> </code><code>}</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>var dispath=dispatch_get_global_queue(dispatch_queue_priority_high, 0)</code>
<code> </code><code>dispatch_async(dispath, { () -> void </code><code>in</code>
<code> </code><code>var url:nsurl = nsurl(string: url!)!</code>
<code> </code><code>var data:nsdata?=nsdata(contentsofurl: url)</code>
<code> </code><code>if</code> <code>data != nil {</code>
<code> </code><code>zyhimage=uiimage(data: data!)</code>
<code> </code><code>//</code><code>寫緩存</code>
<code> </code><code>dispatch_async(dispatch_get_main_queue(), { () -> void </code><code>in</code>
<code> </code><code>//</code><code>重新整理主ui</code>
<code> </code><code>self.image=zyhimage</code>
<code> </code><code>})</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>})</code>
<code> </code><code>}</code>
<code> </code>
<code>}</code>
緩存的處理這裡采用的是寫檔案的方式,通過檔案名來對緩存進行管理,這個架構還不完善,後面會加入緩存清除等功能。緩存的核心代碼如下:
<code>class func readcachefromurl(url:nsstring)->nsdata?{</code>
<code> </code><code>var data:nsdata?</code>
<code> </code><code>var path:nsstring=zyhwebimagechchecenter.getfullcachepathfromurl(url)</code>
<code> </code><code>if</code> <code>nsfilemanager.defaultmanager().fileexistsatpath(path) {</code>
<code> </code><code>data=nsdata.datawithcontentsofmappedfile(path) as? nsdata</code>
<code> </code><code>return</code> <code>data</code>
<code> </code><code>class func writecachetourl(url:nsstring, data:nsdata){</code>
<code> </code><code>println(data.writetofile(path, atomically: </code><code>true</code><code>))</code>
<code> </code><code>//</code><code>設定緩存路徑</code>
<code> </code><code>class func getfullcachepathfromurl(url:nsstring)->nsstring{</code>
<code> </code><code>var chchepath=nshomedirectory().stringbyappendingstring(</code><code>"/library/caches/mycache"</code><code>)</code>
<code> </code><code>var filemanager:nsfilemanager=nsfilemanager.defaultmanager()</code>
<code> </code><code>filemanager.fileexistsatpath(chchepath)</code>
<code> </code><code>if</code> <code>!(filemanager.fileexistsatpath(chchepath)) {</code>
<code> </code><code>filemanager.createdirectoryatpath(chchepath, withintermediatedirectories: </code><code>true</code><code>, attributes: nil, error: nil)</code>
<code> </code><code>//</code><code>進行字元串處理</code>
<code> </code><code>var newurl:nsstring</code>
<code> </code><code>newurl=zyhwebimagechchecenter.stringtozyhstring(url)</code>
<code> </code><code>chchepath=chchepath.stringbyappendingformat(</code><code>"/%@"</code><code>, newurl)</code>
<code> </code><code>return</code> <code>chchepath</code>
<code> </code><code>class func stringtozyhstring(str:nsstring)->nsstring{</code>
<code> </code><code>var newstr:nsmutablestring=nsmutablestring()</code>
<code> </code><code>for</code> <code>var i:nsinteger=0; i < str.length; i++ {</code>
<code> </code><code>var c:unichar=str.characteratindex(i)</code>
<code> </code><code>if</code> <code>(c>=48&&c<=57)||(c>=65&&c<=90)||(c>=97&&c<=122){</code>
<code> </code><code>newstr.appendformat(</code><code>"%c"</code><code>, c)</code>
<code> </code><code>return</code> <code>newstr.copy() as nsstring</code>
<code> </code>
因xcode的版本不同,swift語言文法随環境時常會變化,此版本在6.1中可用,更高版本中需要修改少部分即可。