Обновление значений в NSArray, поддерживающем UITableView - PullRequest
2 голосов
/ 29 марта 2012

Какао, а не iOS.У меня есть массив элементов, который поддерживает UITableview.Я прохожу массив и выполняю ряд задач, в частности, я вызываю внешний скрипт, исполняемый с помощью NSTask.Пока задача выполняется, я хочу обновить столбец «Состояние» в UITableView.

Я обновляю значение массива, связанного со столбцом, и затем вызываю [_TableView reloadData], но в пользовательском интерфейсе не происходит никаких изменений, пока не будет выполнена вся обработка.

    for (int ix = 0; ix < [_sceneList count]; ix++) {

        // update status in array backing the TableView        
        [[_sceneList objectAtIndex:ix] setRenderStatus:@"Rendering"];
        [_tableView reloadData];

        // execute command via shell script
        [self runScript:@"run_script.bash":appPath:outputFormat:showGUI:threadCnt:resolution:renderFile:outputFile];

        [[_sceneList objectAtIndex:ix] setRenderStatus:@"Complete"];        
        [_tableView reloadData];
     }

код для run_script:

-(void) runScript:(NSString*)scriptName:(NSString*)appPath:(NSString*)outputFormat:(NSString*)showGUI:(NSString*)threadCnt:(NSString*)resolution:(NSString*)renderFile:(NSString*)outputFile;  
{
    NSTask *task;
    task = [[NSTask alloc] init];

    NSArray *arguments;
    NSString* newpath = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath] , scriptName];

    [task setLaunchPath: newpath];

    arguments = [NSArray arrayWithObjects:appPath, showGUI, renderFile,  outputFile, outputFormat, threadCnt, resolution ,nil];

    [task setArguments: arguments];

    NSPipe *pipe;
    pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];
    [task setStandardInput:[NSPipe pipe]];

    NSFileHandle *file;
    file = [pipe fileHandleForReading];

    [task launch];

    NSData *data;
    data = [file readDataToEndOfFile];

    NSString *string;
    string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    NSLog (@"script returned:\n%@", string);    
}

Есть идеи, почему пользовательский интерфейс не обновляется?

Есть ли какой-нибудь метод "tableview: updateRow", который мне следует использовать?

_mike

1 Ответ

0 голосов
/ 30 марта 2012

Похоже, что что-то в runScript работает синхронно и блокирует ваш основной поток от обновления пользовательского интерфейса.После прочтения this я думаю, что ваша проблема заключается в

data = [file readDataToEndOfFile];

Вместо этого сделайте этот асинхронный вызов с:

[file readInBackgroundAndNotify];

Вам нужно будет подписаться науведомление в NotificationCenter, возможно, внутри вашего метода init с чем-то вроде этого:

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(fileHandleReadCompleted:)
name:NSFileHandleReadCompletionNotification 
object:nil];

Затем внутри вашего fileHandleReadCompleted: вы можете использовать

data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];

для получения результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...