Ios 主线程上NSFileHandle上的Handle writeData方法
既然Ios 主线程上NSFileHandle上的Handle writeData方法,ios,objective-c,iphone,grand-central-dispatch,Ios,Objective C,Iphone,Grand Central Dispatch,既然writeData调用是同步的,那么当我们从主队列以外的其他线程调用writeData时,使用它的最佳方式是什么 例如,调用web服务来获取一些数据,并将completionHandler分配给web服务调用。现在,这个完成处理程序将在不同的线程上执行(而不是在主队列上) 我看到我的应用程序在writeData方法上卡住了5到6分钟。这是我现在唯一能怀疑的事情 我尝试使用dispatch\u async(mainQueue)环绕我的writeData调用,但没有成功 - (void) wri
writeData
调用是同步的,那么当我们从主队列以外的其他线程调用writeData时,使用它的最佳方式是什么
例如,调用web服务来获取一些数据,并将completionHandler分配给web服务调用。现在,这个完成处理程序将在不同的线程上执行(而不是在主队列上)
我看到我的应用程序在writeData
方法上卡住了5到6分钟。这是我现在唯一能怀疑的事情
我尝试使用dispatch\u async(mainQueue)
环绕我的writeData
调用,但没有成功
- (void) writeToFile: (NSString *) targetString
{
//_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 (![[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 = @"";
}
您可以在后台线程中执行保存部分
- (void) writeToFile: (NSString *) targetString
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *oldString = [_loggingString copy];
_loggingString = [oldString stringByAppendingString:targetString];
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 = @"";
});
}
不建议在主线程中执行文件写入操作。此外,默认全局队列的性能也会出现问题,因为系统无法对任务进行优先级排序 因此,请尝试创建4种类型的后台队列:
dispatch_queue_t GlobalUserInteractiveQueue(void) {
return dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0);
}
dispatch_queue_t GlobalUserInitiatedQueue(void) {
return dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0);
}
dispatch_queue_t GlobalUtilityQueue(void) {
return dispatch_get_global_queue(QOS_CLASS_UTILITY, 0);
}
dispatch_queue_t GlobalBackgroundQueue(void) {
return dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0);
}
在代码中,只需执行以下操作:
创建自定义队列。
queue=dispatch\u queue\u create(“customQueueName”,NULL);
然后用dispatch async编写代码
dispatch_async( queue ,
^ {
// execute asynchronously
[fileHandle seekToEndOfFile];
[fileHandle writeData:[_loggingString dataUsingEncoding:NSUTF8StringEncoding]];
});
在此处检查每个队列的工作过程:
分享您如何处理NSFileHandle写入操作的示例。@AnkitThakur,用代码编辑了我的问题。如果我在其中执行任何操作,是否需要重新获取主队列的副本?只是想知道…不,这不是必需的,我只是添加了它,以防任务完成后需要获取主线程。已更新答案并将其删除