dispatch_data_t 轉(zhuǎn)換成 NSData 類型

前段時(shí)間開發(fā),碰到了一個(gè)問題,請(qǐng)求一個(gè)java接口,后臺(tái)返回的數(shù)據(jù)原本應(yīng)該是視頻數(shù)據(jù)流,本來可以直接使用NSData接收就OK,但是出現(xiàn)了以前未曾遇到的dispatch_data_t,因?yàn)槲募^大的緣故,返回了dispatch_data_t類型的數(shù)據(jù)。

安排一下:

創(chuàng)建一個(gè)NSData類型的類別:

.h

//
//  NSData+PIOAdditions.h
//  LuoJing
//
//  Created by 陳志遠(yuǎn) on 2020/11/12.
//  Copyright ? 2020 陳志遠(yuǎn). All rights reserved.
//
#import <Foundation/Foundation.h>
#import <dispatch/data.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSData (PIOAdditions)


+ (instancetype)dataWithDispatchData:(dispatch_data_t)data;

// returns a dispatch_data_t representation of this object.
// This does not copy the internal bytes
-  (dispatch_data_t)copyDispatchData DISPATCH_RETURNS_RETAINED;


@end

NS_ASSUME_NONNULL_END

.m

//
//  NSData+PIOAdditions.m
//  LuoJing
//
//  Created by 陳志遠(yuǎn) on 2020/11/12.
//  Copyright ? 2020 陳志遠(yuǎn). All rights reserved.
//

#import "NSData+PIOAdditions.h"

// A way to do copyless dispatch data if the dispatch_data_t has just one segment.
@interface _PIOMappedDispatchData : NSData

- (instancetype)initWithData:(dispatch_data_t)data;

@end


@implementation NSData (PIOAdditions)

+ (instancetype)dataWithDispatchData:(dispatch_data_t)data;
{
    return [[_PIOMappedDispatchData alloc] initWithData:data];
}

- (dispatch_data_t)copyDispatchData;
{
    // just incase we are mutable;
    CFDataRef immutableSelf = CFBridgingRetain([self copy]);
    return dispatch_data_create(self.bytes, self.length, dispatch_get_main_queue(), ^{
        CFRelease(immutableSelf);
    });
}

@end

@implementation _PIOMappedDispatchData  {
    dispatch_data_t _data;
    NSUInteger _length;
    const void *_bytes;
}

- (instancetype)initWithData:(dispatch_data_t)data;
{
    const void *buffer;
    size_t size = 0;
    data = dispatch_data_create_map(data, &buffer, &size);
    
    self = [super init];
    if (self != nil) {
        _bytes = buffer;
        _length = size;
        _data = data;
    }
    return self;
}


- (NSUInteger)length;
{
    return _length;
}

- (const void *)bytes;
{
    return _bytes;
}

- (dispatch_data_t)copyDispatchData;
{
    return _data;
}

- (void)dealloc
{
    if (_data != NULL) {
       
    }
}

- (id)copy;
{
    return [[_PIOMappedDispatchData alloc] initWithData:_data];
}

@end

特別提醒 ****

不要去打印返回的Data

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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