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

Ios NSFileHandle writeData同步延迟主线程操作,ios,objective-c,multithreading,grand-central-dispatch,nsfilemanager,Ios,Objective C,Multithreading,Grand Central Dispatch,Nsfilemanager,我有一个日志记录器的自定义实现,它在我的应用程序中记录操作和操作 一个强大的NSString引用位于我的一个单例类中 每当我需要记录一些东西时,我就调用一个名为“-(void)writeToFile:(BOOL)rightNow”的方法。这个方法也存在于那个单例类中 立即传递到的Yes,将触发对NSFileHandle上的writeData:的即时调用,强制将NSString写入文件,然后清空NSString 否,将只追加字符串并等待rightNow中的Yes值执行写入操作 每当我从通过计时器调

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

一个强大的
NSString
引用位于我的一个单例类中

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

立即传递到
的Yes
,将触发对NSFileHandle上的
writeData:
的即时调用,强制将NSString写入文件,然后清空NSString

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

每当我从通过计时器调用的方法调用
writeToFile
,并且
rightNow
参数为
YES
,我的应用程序都会停止5/6分钟

类似地,如果我从一个块调用
writeToFile
(比方说一个web服务返回了一个块上的一些数据),应用程序将再次停止

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

这是预期的行为吗?我可以围绕GCD包装我的
writeToFile
调用,但是如果我正在请求的线程(主/全局)的当前状态是仅此而已呢?在主线程上调用主线程不会产生死锁吗

代码:


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

dispatch_queue_t loggingQueue = dispatch_queue_create("MyLoggingQueue", DISPATCH_QUEUE_SERIAL);
然后,始终在该队列上执行日志记录:

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

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

我使用这个日志函数更简单的版本,它总是将传递的字符串记录到一个文件中(no
rightNow
参数),并且我可以同时从多个线程进行日志记录(不同线程的混合输出除外)。因此,问题不是由哪个线程写入文件引起的。请提供您正在执行的实际代码,我们将看到(现在显示的代码甚至没有
rightNow
参数,它正在复制
\u loggingString
,但从不使用副本!)@gog用代码编辑了我的问题
\u loggingString
被复制到
olderString
变量。是否需要将loggingQueue作为强属性?我只是想知道,既然这个方法可以频繁调用,您可以将它设置为属性,也可以将它设置为私有实例变量,如图所示。如果将其作为实例变量,则应在logger singleton类中声明另一个方法
logToFile
,该方法执行
dispatch\u async
调用
dispatch_async(loggingQueue, ^(void){
    [TheLoggerSingleton writeToFile:@"LogMe" rightNow:YES];
});