是否有更有效的方法将日志附加到日志文件而不是这个?

时间:2015-05-19 07:51:45

标签: ios foundation

我不喜欢我在这里写的东西。日志文件的全部内容被拉入内存,我想知道是否有办法追加到那里的任何东西,而不是把它拉出来。

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"Log"];
NSMutableString *content = [@"" mutableCopy];
NSMutableString *existing = [[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil] mutableCopy];
[content appendString:existing];
[content appendString:@"\n"];
[content appendString:[user logDetails]];
[[content copy] writeToFile:filePath atomically:NO encoding:NSUTF8StringEncoding error:nil];

3 个答案:

答案 0 :(得分:0)

该代码非常效率低下,但这是因为使用Foundation类时,文件操作通常很差。

我建议使用C-API函数fopen()fprintf()等。只需从NSString个对象写入UTF-8字符串,日志记录就会快得多,并且不会危及应用程序的内存占用。

答案 1 :(得分:0)

如果您想将自定义内容写入文件的末尾,那么请参阅@Amadan的注释。如果您想要一个正确的日志记录系统,包括日志轮换和异步日志记录以及各种其他事情,请查看https://github.com/CocoaLumberjack/CocoaLumberjack。与你一直梦想着自己投资相比,更多的爱已经消失了。

忽略@ trojanfoe的回答 - 如果你接受C API,你只需为自己做更多的工作,但收益微乎其微。

答案 2 :(得分:0)

我在FileSystem课程中使用此内容:

+ (BOOL)appendData:(NSData *)_data toFile:(NSString *)_path
{
    if( !_path || !_data )
        return NO;

    // TODO : check before for file existence

    // open for binary append
    FILE *_file = fopen([_path UTF8String], "ab"); 

    if( !_file )
        return NO;

    size_t _nbObjToWrite = [_data length];
    size_t _nbObjWritten = fwrite([_data bytes], 1, _nbObjToWrite, _file); // write [_data length] objectq of length 1 from [_data bytes] buffer in _file

    if( _nbObjWritten != _nbObjToWrite ) {
        fclose( _file );
        return NO;
    }

    fclose( _file ); // will automatically flush the stream

    return YES;
}

然后,您可以致电:

[MyClass appendData:[<myLogStringToAdd> dataUsingEncoding:NSUTF8StringEncoding] toFile:@"<pathToMyFile>"];