斷點(diǎn)讀取

什么是斷點(diǎn)讀取呢?就是一點(diǎn)一點(diǎn)的讀取,每次只讀一定的字節(jié),效果如下:

效果圖.gif

如果是我們平常的imageView的加載圖片,那么整張圖片會(huì)直接顯示出來(lái),現(xiàn)在我們使用了斷點(diǎn)讀取的效果以后,可以看到圖片它是從上到下一點(diǎn)一點(diǎn)的被讀取,并非完全一次性的讀取,這中做法到底是為了什么呢?我們想一下,如果現(xiàn)在我們有一個(gè)本地視頻需要播放,假設(shè)視頻的大小為1G,那我們需要播放它,怎么辦?是一次性把1G的視頻全部加載完成后去播放?還是一邊加載一邊播放。如果全部加載完成后去播放,即使手機(jī)處理系統(tǒng)再好,也需要時(shí)間,那么用戶體驗(yàn)會(huì)特別差,相反,如果我們一邊加載一邊播放的效果會(huì)好些。說(shuō)了這么多,那么這種效果到底該如何去實(shí)現(xiàn)呢?它的核心就是在線程中,平常我們都是在異步子線程中加載數(shù)據(jù),在回到異步主線程中刷新UI,它的效果就是等到全部數(shù)據(jù)都加載完成以后才會(huì)刷新UI。現(xiàn)在我們需要的是一邊加載一邊刷新UI,所以呢我們就不能再回到異步主線程去刷新UI了,而是在同步主線程中去刷新UI。那我們來(lái)看看代碼:


// 這里我們需要一個(gè)可變的Data,為什么呢?因?yàn)槲覀冞@個(gè)是斷點(diǎn)讀取,所以每一次都會(huì)增加一定的字節(jié),并且還得保證以前的字節(jié)不能丟失
NSMutableData *imageData = [NSMutableData data];

    // 我們要在異步子線程中去加載數(shù)據(jù)
    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSString *imageUrl = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"png"];

        // 從文件中讀取
        NSFileHandle * handle = [NSFileHandle fileHandleForReadingFromURL:[NSURL fileURLWithPath:imageUrl] error:nil];
        // 每次讀取得data
        NSData *readData = nil;

        // 讀取次數(shù)
        int i = 0;
        do {

            //偏移量,第一次從0讀到100 第二次就是從100-200
            [handle seekToFileOffset:i*100];

            readData = [handle readDataOfLength:100];

            [imageData appendData:readData];

            // 同步主線程中刷新UI
            dispatch_sync(dispatch_get_main_queue(), ^{

                self.myImageView.image = [UIImage imageWithData:imageData];
            });
            
            i++;
        } while (readData.length == 100); // 如果最后一次讀取的< 100 那么就是說(shuō)明已經(jīng)讀完了,為什么說(shuō)是<100就讀取完畢了呢?我們想一想,每次讀取100,最后一次肯定是<100的。
    });

Demo下載地址:https://github.com/DaZhan/Breakpoint-Read.git

如有雷同,那么我就是抄你的。謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,825評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,096評(píng)論 4 61
  • 五絕?詠秋篁(平水韻) 李鱷淚 我愛(ài)池邊樹(shù),秋來(lái)葉不凋。為圓千尺夢(mèng),霜露一肩挑。
    雷純閱讀 781評(píng)論 1 7
  • 《清明時(shí)節(jié)》 通往墓園的路擁堵起來(lái) 鮮花和柳條也紛紛漲價(jià) 來(lái)到墓前清掃落葉 燭火搖曳、錫箔焚化 往事如打翻的墨水瓶...
    詩(shī)人蝌蚪閱讀 427評(píng)論 1 4
  • http://developer.android.youdaxue.com/guide/topics/ui/men...
    acc8226閱讀 1,293評(píng)論 0 3

友情鏈接更多精彩內(nèi)容