我有一个有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 @"";
}
答案 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];
}
然后你的用户界面应该在你的开发工作正在进行时进行更新。