首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS -来自NSData完成处理程序的writeToFile

iOS -来自NSData完成处理程序的writeToFile
EN

Stack Overflow用户
提问于 2018-02-24 00:05:23
回答 2查看 517关注 0票数 0

我正在从一个网络服务获得一个字节的文件,我的目标是获得这些字节,把它们放入NSData,然后写入到一个文件中,一旦writeToFile是100%完成,然后我会显示该文件(它是一个QLPreviewController,可以是多达6页)。

我可以从get服务中获取字节,并将它们放入NSData中,如下所示:

代码语言:javascript
运行
复制
NSArray *byteArray = [dataSource.areaData GetPDFFileData:[NSString stringWithFormat:@"%@",encodedUrlStr]];

        NSData *data;

        for (NSDictionary *dict in byteArray) {
            NSString *base64 = dict[@"data"];
            data = [[NSData alloc] initWithBase64EncodedString:base64 options:0];
        }

现在我试着这样写这个文件:

代码语言:javascript
运行
复制
if (data)
        {
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];

            filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,PDFFile];

            [data writeToFile:filePath atomically:YES];

        }

现在,我要做的是有一个完成处理程序,这样在文件完全写入之前不会发生任何其他事情。做这件事最好的方法是什么?

我也开始研究NSFileHandle了,这是不是一个更好的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-24 00:27:55

使用NSFilePresenter监视文件的更改,并使用NSFileCoordinator对其进行写入

在模拟代码中:

代码语言:javascript
运行
复制
NSFilePresenter *p = [NSFilePresenter presenterWithFile:f];
[p signupForChangeNotificationsOrSetDelegateOrWhatever....];

//write 
NSFileCoordinator *c = [NSFileCoordinator coordinatorWithPresenter:p];
[c coordinate writeData....]

... called back by p cause we changed
票数 0
EN

Stack Overflow用户

发布于 2018-02-24 00:12:33

不需要担心完成,如果这是在主队列中运行它是串行的,但最好是保存在后台队列,并读取内容来验证和呈现在主队列中

代码语言:javascript
运行
复制
  DispatchQueue.global(qos: .background).async {
        print("This is run on the background queue")

        if (![[NSFileManager defaultManager] fileExistsAtPath:filePath])
        {
            NSLog(@"not exists");

            NSData *fileContents = [@"" dataUsingEncoding:NSUTF8StringEncoding];
            [[NSFileManager defaultManager] createFileAtPath:filePath
                                                    contents:fileContents
                                                  attributes:nil];

        }
        else
        {
             NSLog(@"exists");

        }


        NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
        [myHandle seekToEndOfFile];


        NSString*strTowrite=[NSString stringWithFormat:@"%@ || %@ --- %@ \r\n",dt,acion,name];

        [myHandle writeabilityHandler];

        [myHandle writeData:[strTowrite dataUsingEncoding:NSUTF8StringEncoding]];


    DispatchQueue.main.async {
        NSString*content=[[NSString alloc] initWithContentsOfFile:filePath
                                                         encoding:NSUTF8StringEncoding
                                                            error:&error];
         if(content)
        {


            NSLog(@"content is : %@ Err : %@",content,error);

            // [self sendfile];


        }
        else
        {

            NSLog(@"Failed to store the file. Error = %@", error);

        }
     }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48951887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档