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,用代码编辑了我的问题。如果我在其中执行任何操作,是否需要重新获取主队列的副本?只是想知道…不,这不是必需的,我只是添加了它,以防任务完成后需要获取主线程。已更新答案并将其删除