美文网首页
resumeData解析方法--OC版

resumeData解析方法--OC版

作者: 西瓜王子kobe | 来源:发表于2019-06-13 15:26 被阅读0次

    实现断点下载和后台下载过程中,用到最多的是叫resumeData的东西,变化多端,神出鬼没,想要了解这个变化的可以参考这位大神的文章,https://www.jianshu.com/p/da565e14ef88,在仿写OC版轮子的过程中发现一个问题:上面那位大神由于采用的是swift语言,在解析resumeData过程中,用到下面这段代码

    internal class func getResumeDictionary(_data:Data) ->NSMutableDictionary? {
            varresumeDictionary:NSMutableDictionary?
            if#available(OSX10.11,iOS9.0, *) {
                letkeyedUnarchiver =NSKeyedUnarchiver(forReadingWith: data)
                do{
                    resumeDictionary =trykeyedUnarchiver.decodeTopLevelObject(of:NSMutableDictionary.self, forKey:"NSKeyedArchiveRootObjectKey") ??nil
                    ifresumeDictionary ==nil{
                        resumeDictionary =trykeyedUnarchiver.decodeTopLevelObject(of:NSMutableDictionary.self, forKey:NSKeyedArchiveRootObjectKey)
                    }
                }catch{}
                keyedUnarchiver.finishDecoding()
            }
            ifresumeDictionary ==nil{
                do{
                    resumeDictionary =try PropertyListSerialization.propertyList(from: data, options: PropertyListSerialization.ReadOptions(), format: nil) as? NSMutableDictionary
                }catch{}
            }
            return resumeDictionary
        }
    

    注意这行代码:

    keyedUnarchiver.decodeTopLevelObject(of: NSMutableDictionary.self, forKey: "NSKeyedArchiveRootObjectKey") ?? nil
    

    点进去看看:

    @available(OSX 10.11, iOS 9.0, *)
        public func decodeTopLevelObject<DecodedObjectType>(of cls: DecodedObjectType.Type, forKey key: String) throws -> DecodedObjectType? where DecodedObjectType : NSObject, DecodedObjectType : NSCoding
    

    根据传入的类型,查找NSKeyedArchiveRootObjectKey根键,解析为相应类型,最后得到一个key-value的字典,里面是这个信息:


    35831BAC-A332-4538-BE99-82A1928A8F0E.png

    从这里可以拿到你可能想要的信息,接收量、临时文件的名称等等信息,但在oc中蒙圈了,试了好几种方法,都无法解析出这个字典。
    根据错误信息的反馈,最后找到了解决办法:

    //将resumeData解析成字典
    + (NSMutableDictionary *)getResumeDictionary:(NSData *)data{
        NSMutableDictionary *resumeDictionary = [NSMutableDictionary dictionary];
        NSError *error;
        if (@available(iOS 9.0,*)) {
            id keyUnarchiver =  [[NSKeyedUnarchiver alloc]initForReadingFromData:data error:&error];
            @try {
                NSError *decodeError1;
                NSSet *typeSet = [NSSet setWithObjects:[NSDictionary class],[NSMutableData class],nil];
                resumeDictionary = [keyUnarchiver decodeTopLevelObjectOfClasses:typeSet forKey:@"NSKeyedArchiveRootObjectKey" error:&decodeError1];
                if (resumeDictionary == nil) {
                  resumeDictionary = [keyUnarchiver decodeTopLevelObjectOfClasses:typeSet forKey:NSKeyedArchiveRootObjectKey error:&decodeError1];
                }
            } @catch (NSException *exception) {
                
            }
            [keyUnarchiver finishDecoding];
        }
        return resumeDictionary;
    }
    

    resumeData根键为一个字典类型,再往里走一层为NSMutableData类型,只要将对应的解析类型传入,最后就能完整的解析出想要的结果,这是我对这个方法的理解,第一次发文,不对请指正。

    相关文章

      网友评论

          本文标题:resumeData解析方法--OC版

          本文链接:https://www.haomeiwen.com/subject/dkdsfctx.html