NSFileHandle writeData同步延迟主线程操作

时间:2018-10-23 07:05:19

标签: ios objective-c multithreading grand-central-dispatch nsfilemanager

我有一个记录器的自定义实现,该记录器记录了我的应用程序中的操作和操作。

强大的NSString参考生活在我的Singleton课堂之一中。

每当需要记录某些内容时,我都会调用一个名为“ -(void)writeToFile: (BOOL) rightNow”的方法。这种方法也存在于Singleton类中。

传递给rightNow的是,将触发对NSFileHandle上的writeData:的立即调用,强制将NSString写入文件并随后清空NSString。

否,将仅追加字符串并等待Yes中的rightNow值来执行写操作。

每当我通过计时器调用的方法调用writeToFile时,rightNow参数为YES时,我的应用就会暂停5/6分钟。

类似地,如果我从一个块调用writeToFile(例如,一个Web服务在一个块上返回了一些数据),则该应用会再次暂停。

据我所知,由于writeData由于某些原因而同步工作,因此在从块或计时器(假定在不同线程上调用)中调用时会中断。

这是预期的行为吗?我可以将writeToFile调用包装在GCD周围,但是如果我正在请求的线程(主/全局),当前状态是什么呢?它不会在主线程上创建死锁来调用主线程吗?

代码:

- (void) writeToFile: (NSString *) targetString rightNow: (BOOL) rightNow
{
    //_loggingString holds the data, which keeps on accumulating as the user performs operations. At some point of time (callbacks from API's I call this method, to actually, write this string in the file and clear this string afterwards.)
    NSString *oldString = [_loggingString copy];

    _loggingString = [oldString stringByAppendingString:targetString];

    if (rightNow)
    {
        if (![[NSFileManager defaultManager]fileExistsAtPath:@"somePath"])
        {
            [[NSFileManager defaultManager]createFileAtPath:@"somePath" contents:nil attributes:nil];
        }

        NSFileHandle *fileHandle =  [NSFileHandle fileHandleForWritingAtPath:@"somePath"];

        [fileHandle seekToEndOfFile];

        [fileHandle writeData:[_loggingString dataUsingEncoding:NSUTF8StringEncoding]];

        _loggingString = @"";
    }
}

1 个答案:

答案 0 :(得分:0)

由于日志记录需要5/6分钟,并且会停止应用程序中的后续操作,因此只需使用GCD将日志记录移至另一个队列即可:

dispatch_queue_t loggingQueue = dispatch_queue_create("MyLoggingQueue", DISPATCH_QUEUE_SERIAL);

,然后始终在该队列上执行日志记录:

dispatch_async(loggingQueue, ^(void){
    [TheLoggerSingleton writeToFile:@"LogMe" rightNow:YES];
});

在这一点上,使用writeToFileYES作为NO参数调用rightNow并没有什么区别;您可以随时使用YES