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