2011-10-09 67 views
0

我有一个只读的文本字段,我用它作为日志显示。我有一个操作,删除应用程序的文档目录中的所有文件。我想在删除每个文件时插入一行日志。但是文本字段仅在整个操作完成时更新。我该如何解决?在循环中运行时更新ui

这里是我的代码:

NSFileManager *fm = [[[NSFileManager alloc] init] autorelease]; 
NSError *error = nil; 
for (NSString *fileName in array) { 
    NSString *filePath = [DOCUMENT_PATH_VALUE stringByAppendingFormat:@"/%@", fileName]; 
    [fm removeItemAtPath:filePath error:&error]; 

    if (!error) { 
     NSString *log = [NSString stringWithFormat:@"removed success: %@", fileName]; 
     [self logThis:log]; 
    }else{ 
     NSString *log = [NSString stringWithFormat:@"remove failed: %@, %@", fileName, [error localizedDescription] ]; 
     [self logThis:log]; 

-(void)logThis:(NSString*) text{ 
    NSRange range = NSMakeRange([updateLogTextView.text length], [text length]); 
    updateLogTextView.text = [updateLogTextView.text stringByAppendingFormat:@"%@\n", text]; 

    [updateLogTextView scrollRangeToVisible:range]; 
} 

回答

0

您需要将长时间运行的操作移动到后台线程/队列中,并确保UI更新代码始终在主线程上执行。

例子:

- (void)processFiles:(NSArray *)array 
{ 
    //You need to create your own autorelease pool in background threads: 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    //... 
    NSString *log = ...; 
    [self performSelectorOnMainThread:@selector(logThis:) withObject:log waitUntilDone:NO]; 
    //... 
    [pool release]; 
} 

你会使用然后开始你的操作:

[self performSelectorInBackground:@selector(processFiles:) withObject:files]; 

使用大中央调度与块将是另一种选择。

有关更多详细信息,请参阅Threading Programming GuideConcurrency Programming Guide

0

你需要寻找到Threading和作出这一呼吁异步。你目前阻止你的主线程(假设它是从那里调用的)。您需要将两者分开,这样一个单独的线程将执行繁重的操作,而主线程将使用UI中的新文本进行更新。

0

我刚开始ios开发,但听起来像你需要重绘该UIText我不知道如何,但我会假设当你的日志写道,你可以dealloc你原来的UIText对象realloc它,它应该重新绘制新的日志消息。唯一的问题是,它很可能会非常快速地更新,所以重绘不值得,除非ios具有睡眠功能?

喜欢的东西: 的Alloc和init文本 然后在循环后每次写或日志的dealloc文本和realloc新的消息,并初始化文本

这应该重绘UIText对象和更新文本,如果它不指望内存写入错误/应用程序崩溃