直接上代码
DownLoadManager.h
@interface DiskDownLoadManager : NSObject
@property (nonatomic,copy) void(^checkDiskFile)(NSString *);
+(instancetype)shareManager;
- (BOOL)getFile:(DiskItemModel *)model;
///预览文档
- (void)checkFileDisk:(DiskItemModel *)model;
@end
DownLoadManager.m
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
// @synchronized (self) {
// // 为了防止多线程同时访问对象,造成多次分配内存空间,所以要加上线程锁
// if (_instance == nil) {
// _instance = [super allocWithZone:zone];
// }
// return _instance;
// }
// 也可以使用一次性代码
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
});
return _instance;
}
// 为了使实例易于外界访问 我们一般提供一个类方法
// 类方法命名规范 share类名|default类名|类名
+(instancetype)shareManager
{
//return _instance;
// 最好用self 用Tools他的子类调用时会出现错误
return [[self alloc]init];
}
// 为了严谨,也要重写copyWithZone 和 mutableCopyWithZone
-(id)copyWithZone:(NSZone *)zone
{
return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}
///预览文档
- (void)checkFileDisk:(DiskItemModel *)model
{
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *headerPath = [NSString stringWithFormat:@"%@/%@/%@/",path,@"MyDisk",@"ziliao"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filePath = [headerPath stringByAppendingPathComponent:model.dataName]; //docPath为文件名
if (![fileManager fileExistsAtPath:filePath]) {
if (![fileManager fileExistsAtPath:headerPath]) {
[fileManager createDirectoryAtPath:headerPath withIntermediateDirectories:YES attributes:nil error:nil];
}
[self downloadDocxWithFilePath:filePath dataId:model.dataId];
}else{//文件已下载的情况下,直接回调,参数是文件路径
if (_checkDiskFile) {
_checkDiskFile(filePath);
}
}
}
/**
下载文件
@param docPath 文件路径
@param fileName 文件名
*/
-(void)downloadDocxWithFilePath:(NSString *)filePath dataId:(NSString *)dataId {
//下载文件通常用的方法,自己另行配置,下面的文件下载只是针对接口,我觉得并不好
NSString *urlString = APIBASE;
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:APIBASE]];
manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects: @"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/plain",nil];
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不会解析,数据是data,需要自己解析
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *parameters = @{@"dataIds":dataId};
NSURLSessionDataTask *task = [manager POST:API_DiskDownLoad parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
BOOL result = [fileManager createFileAtPath:filePath contents:(NSData *)responseObject attributes:nil];
if (result) {
NSLog(@"============写入成功");
//文件已经存在,直接打开
if (_checkDiskFile) {
_checkDiskFile(filePath);
}
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
[task resume];//开始下载 要不然不会进行下载的
}
要打开的地方
/**
打开文件
@param filePath 文件路径
*/
-(void)openDocxWithPath:(NSString *)filePath {
UIDocumentInteractionController *doc= [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];
doc.delegate = self;
[doc presentPreviewAnimated:YES];
}
#pragma mark - UIDocumentInteractionControllerDelegate
//必须实现的代理方法 预览窗口以模式窗口的形式显示,因此需要在该方法中返回一个view controller ,作为预览窗口的父窗口。如果你不实现该方法,或者在该方法中返回 nil,或者你返回的 view controller 无法呈现模式窗口,则该预览窗口不会显示。
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
return self;
}
- (UIView*)documentInteractionControllerViewForPreview:(UIDocumentInteractionController*)controller {
return self.view;
}
- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController*)controller {
return CGRectMake(0, 30, kSCREEN_WIDTH, kSCREEN_HEIGHT);
}
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦