基于- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler;
[self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
? ? ? ? ? ? [resumeData writeToFile:tmpPath atomically:YES];
? ? ? ? }];
//讀字節(jié)數(shù)
NSMutableDictionary *resumeDataDic =[NSPropertyListSerialization propertyListWithData:resumeData options:NSPropertyListImmutable format:nil error:nil];
[resumeDataDic objectForKey:@"NSURLSessionResumeBytesReceived"]
網(wǎng)上很多教程教如何用這個方法實現(xiàn)斷點續(xù)傳,然而實際上我用這個方法并不能獲取到已經(jīng)下載的字節(jié)數(shù)
最后這樣拿到了已下載字節(jié)數(shù):
? ? ? ? NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resumeData];
? ? ? ? NSMutableDictionary *unarchiverDict = [unarchiver decodeObjectForKey:@"NSKeyedArchiveRootObjectKey"];
? ? ? ? [unarchiver finishDecoding];
? ? ? ? NSString*bytesReceived = [unarchiver DictobjectForKey:@"NSURLSessionResumeBytesReceived"];
我折騰的過程:
首先我根據(jù)教程,將resumeData保存成.plist文件查看
長這樣,長這樣那當然是無法通過
NSMutableDictionary *resumeDataDic =[NSPropertyListSerialization propertyListWithData:resumeData options:NSPropertyListImmutable format:nil?error:nil];
[resumeDataDic objectForKey:@"NSURLSessionResumeBytesReceived"]
獲取到下載的字節(jié)數(shù)啦.
后面突然發(fā)現(xiàn)一個關鍵字:NSKeyedArchiver
這個是數(shù)據(jù)歸檔,我是熟悉的,只不過我沒有查看過數(shù)據(jù)歸檔后的文件長什么樣.
所以我就隨便歸檔了一個數(shù)據(jù),并保存成.plist文件看看是怎樣的.
發(fā)現(xiàn)跟resumeData保存成plist文件文檔格式是完全一致的
所以蘋果是將這個數(shù)據(jù)先歸檔再傳給我們,那么我們只要解檔就可以查看數(shù)據(jù)了
*解檔過程:
首先將文件當成.plist 文件轉(zhuǎn)成字典
NSMutableDictionary *resumeDataDic =[NSPropertyListSerialization propertyListWithData:resumeData options:NSPropertyListImmutable format:nil?error:nil];
然后將這個字典打印出來
主要查看下半部分,classname代表這個歸檔是用什么類打包的, $top對應這個歸檔是用什么key去encode的 ? ?
那么接下來就是常規(guī)的解檔:
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:resumeData];
NSMutableDictionary *unarchiverDict = [unarchiverdecodeObjectForKey:@"NSKeyedArchiveRootObjectKey"];
[unarchiver finishDecoding];
從這字典中獲取你所需要的下載路徑,臨時文件,已下載字節(jié)數(shù),日期等