objective-c – 在多个线程的文件中写入

objective-c – 在多个线程的文件中写入,第1张

概述我正在Objective-C中编写一个下载管理器,它可以同时从多个段下载文件,以提高速度.文件的每个部分都在一个线程中下载. 起初,我想将每个段写在不同的文件中,并在下载结束时将所有文件放在一起.但由于种种原因,这不是一个好的解决方案. 所以,我正在寻找一种方法来写一个特定位置的文件,并且能够处理多个线程,因为在我的应用程序中,每个段都被下载到一个线程中. 在Java中,我知道FileChanne 我正在Objective-C中编写一个下载管理器,它可以同时从多个段下载文件,以提高速度.文件的每个部分都在一个线程中下载.

起初,我想将每个段写在不同的文件中,并在下载结束时将所有文件放在一起.但由于种种原因,这不是一个好的解决方案.

所以,我正在寻找一种方法来写一个特定位置的文件,并且能够处理多个线程,因为在我的应用程序中,每个段都被下载到一个线程中.
在Java中,我知道fileChannel完美地完成了这个技巧,但我不知道在Objective-C中.

解决方法 永远不要忘记,Obj-C基于普通C,因此我只编写一个自己的类,使用标准C API处理文件I / O,它允许您将当前写入位置放在新文件中的任何位置,甚至远远超出当前文件大小(缺少的字节用零字节填充),以及根据需要前进和后退.实现线程安全的最简单方法是使用锁,这不是最快的方法,但在特定情况下,我敢打赌瓶颈当然不是线程同步.该类可以有这样的标题:

@interface MultiThreadfileWriter : NSObject{    @private        file * i_outputfile;        NSLock * i_fileLock;}- (ID)initWithOutputPath:(Nsstring *)afilePath;- (BOol)writeBytes:(const voID *)bytes ofLength:(size_t)length    tofileOffset:(off_t)offset;- (BOol)writeData:(NSData *)data tofileOffset:(off_t)offset;- (voID)close;@end

以及与此类似的实现:

#import "MultiThreadfileWriter.h"@implementation MultiThreadfileWriter- (ID)initWithOutputPath:(Nsstring *)afilePath{    self = [super init];    if (self) {        i_fileLock = [[NSLock alloc] init];        i_outputfile = fopen([afilePath UTF8String],"w");        if (!i_outputfile || !i_fileLock) {            [self release];            self = nil;        }    }    return self;}- (voID)dealloc{    [self close];    [i_fileLock release];    [super dealloc];}- (BOol)writeBytes:(const voID *)bytes ofLength:(size_t)length    tofileOffset:(off_t)offset{    BOol success;    [i_fileLock lock];    success = i_outputfile != NulL        && fseeko(i_outputfile,offset,SEEK_SET) == 0        && fwrite(bytes,length,1,i_outputfile) == 1;    [i_fileLock unlock];    return success;}- (BOol)writeData:(NSData *)data tofileOffset:(off_t)offset{    return [self writeBytes:[data bytes] ofLength:[data length]        tofileOffset:offset    ];}- (voID)close{    [i_fileLock lock];    if (i_outputfile) {        fclose(i_outputfile);        i_outputfile = NulL;    }    [i_fileLock unlock];}@end

可以以各种方式避免锁定.使用Grand Central dispatch和Blocks来安排串行队列上的搜索 *** 作将起作用.另一种方法是使用UNIX(POSIX)文件处理程序而不是标准C语言处理程序(open()和int而不是file *和fopen()),多次复制处理程序(dup()函数)然后放置它们中的每一个因为POSIX I / O是线程安全的,所以避免了在每次写入和锁定时进一步寻找 *** 作.但是,这两种实现方式都会更复杂,便携性更低,并且没有可测量的速度改进.

总结

以上是内存溢出为你收集整理的objective-c – 在多个线程的文件中写入全部内容,希望文章能够帮你解决objective-c – 在多个线程的文件中写入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1021585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存