首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFileHandle writeData同步延迟主线程操作

NSFileHandle writeData同步延迟主线程操作
EN

Stack Overflow用户
提问于 2018-10-23 15:05:19
回答 1查看 264关注 0票数 1

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

在我的一个单例类中有一个很强的NSString引用。

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

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

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

每当我从一个通过计时器调用的方法调用writeToFile时,我的应用程序就会暂停5/6分钟。

类似地,如果我从一个块调用writeToFile (假设一个web服务返回了一个块上的一些数据),应用程序就会再次暂停。

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

这是预期的行为吗?我可以在GCD周围包装我的writeToFile调用,但是如果我请求的线程(主/全局),当前状态是唯一的,该怎么办?在主线程上调用主线程不会造成死锁吗?

代码:

代码语言:javascript
复制
- (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 = @"";
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-10-23 18:31:35

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

代码语言:javascript
复制
dispatch_queue_t loggingQueue = dispatch_queue_create("MyLoggingQueue", DISPATCH_QUEUE_SERIAL);

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

代码语言:javascript
复制
dispatch_async(loggingQueue, ^(void){
    [TheLoggerSingleton writeToFile:@"LogMe" rightNow:YES];
});

此时,使用YESNO作为rightNow参数调用writeToFile没有任何区别;您可以始终使用YES

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

https://stackoverflow.com/questions/52943056

复制
相关文章

相似问题

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