tableview静态单元格动态页脚

时间:2014-02-09 22:58:51

标签: ios uitableview

我有一个有2个部分的静态单元格。一个部分有2行,另一个部分有一行。第一部分中的一个单元执行的操作可能需要一分钟(从数据库中解密大量数据,然后再次加密。

为了通知用户操作正在进行而且没有卡住,我正在尝试执行以下操作:(以下是我实际代码的伪)

问题:

footerString中的doStuff未显示。然而callDoStuff中的那个显示得很好......任何想法我做错了什么?

- (void) doStuff
{
    for (int i=0; i<[resultsArray count]; i++)
    {
      rec1 = [decrypt record1];
      footerString = [@"Preparing item : " stringByAppendingString:rec1];
      [self.tableView reload];
      rec2 = [decrypt record2];
      ...
      ...
      ...
      rec10 = [decrypt record10];
    }
}
从另一个函数

调用

doStuff

- (void) callDoStuff
{
    [self doStuff];
    footerString = @"Done preparing items";
    [self.tableView reload];
}

我的tableviewcontroller

中有以下内容
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
    if (section == 0)
        return footerString;
    else
        return @"";
}

1 个答案:

答案 0 :(得分:1)

您应该在后台线程中进行计算。 在这里为UILabel分配一个新值,但主线程没有时间刷新视图。

- (void) callDoStuff
{
    [self doStuff];
}

- (void)doStuff {
    dispatch_async(dispatch_queue_create("myqueue", NULL) , ^(void) {
        // Here you enter in another thread
        for (int i=0; i<[resultsArray count]; i++)
        {
            rec1 = [decrypt record1];
            dispatch_async( dispatch_get_main_queue(), ^{
                // Here you send message to your UILabel in your main thread
                footerString = [@"Preparing item : " stringByAppendingString:rec1];
            });
            [self.tableView reload];
            rec2 = [decrypt record2];
            ...
            rec10 = [decrypt record10];
        }   
        dispatch_async( dispatch_get_main_queue(), ^{
            // Here you send a callback
            [self doOtherStuffAfterDoStuff];
        });
    });    
}

- (void)doOtherStuffAfterDoStuff {
    footerString = @"Done preparing items";
    [self.tableView reload];
}

然后你的用户界面应该在你的开发工作正在进行时进行更新。