簡體   English   中英

NSFileHandle writeData同步延遲主線程操作

[英]NSFileHandle writeData synchronously delaying main thread operations

我有一個記錄器的自定義實現,它在我的應用程序中記錄操作和操作。

我的Singleton類中有一個強大的NSString引用。

每當需要記錄某些內容時,我都會調用一個名為“ -(void)writeToFile: (BOOL) rightNow ”的方法。 此方法也存在於Singleton類中。

是傳遞給rightNow ,將觸發對NSFileHandle的writeData:的立即調用,強制將NSString寫入文件,然后清空NSString。

否,將僅附加字符串並等待rightNowYes值執行寫操作。

每當我從通過計時器調用的方法中調用writeToFilerightNow參數為YES ,我的應用就會暫停5/6分鍾。

同樣,如果我從一個塊調用writeToFile (例如,Web服務在一個塊上返回了一些數據),則該應用將再次暫停。

據我了解,由於writeData同步工作,由於某種原因,它在從塊或計時器(假定在不同線程上調用)中調用時會中斷。

這是預期的行為嗎? 我可以將我的writeToFile調用包裝在GCD周圍,但是如果我正在請求的線程(主線程/全局線程),當前狀態僅僅是該怎么辦? 它不會在主線程上創建調用主線程的死鎖嗎?

碼:

- (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 = @"";
    }
}

由於您的日志記錄需要5/6分鍾,並且會停止應用程序中的后續操作,因此只需使用GCD將日志記錄移至另一個隊列即可:

dispatch_queue_t loggingQueue = dispatch_queue_create("MyLoggingQueue", DISPATCH_QUEUE_SERIAL);

然后,始終在該隊列上執行日志記錄:

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

在這一點上,它不會使任何區別通話writeToFileYESNO作為rightNow參數; 你總是可以用YES

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM