天天看點

iOS開發swift版異步加載網絡圖檔(帶緩存和預設圖檔)

    與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, { () -&gt; 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(), { () -&gt; 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, { () -&gt; 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(), { () -&gt; 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)-&gt;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)-&gt;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)-&gt;nsstring{</code>

<code>        </code><code>var newstr:nsmutablestring=nsmutablestring()</code>

<code>        </code><code>for</code> <code>var i:nsinteger=0; i &lt; str.length; i++ {</code>

<code>            </code><code>var c:unichar=str.characteratindex(i)</code>

<code>            </code><code>if</code> <code>(c&gt;=48&amp;&amp;c&lt;=57)||(c&gt;=65&amp;&amp;c&lt;=90)||(c&gt;=97&amp;&amp;c&lt;=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中可用,更高版本中需要修改少部分即可。