起初,我想将每个段写在不同的文件中,并在下载结束时将所有文件放在一起.但由于种种原因,这不是一个好的解决方案.
所以,我正在寻找一种方法来写一个特定位置的文件,并且能够处理多个线程,因为在我的应用程序中,每个段都被下载到一个线程中.
在Java中,我知道fileChannel完美地完成了这个技巧,但我不知道在Objective-C中.
@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 – 在多个线程的文件中写入所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)