我试图解决这个问题好几天现在我不得不问你......
我有一个带有 UITableview 的视图(和一个 ViewController)。该表有一个 TableViewController 是在 ViewController 中生成的。TableViewController 调用一个 DataSyncManager sharedInstant 对象(显然在一个单独的类中),它开始与服务器同步数据。
我这样做(首先是刷新方法):
-(void) refresh{
[serverQueueProgressView setProgress:0.0];
[syncingLabel setAlpha:0.5];
[serverQueueProgressView setAlpha:1];
[self performSelector:@selector(reloadTableViewDataSource) withObject:nil afterDelay:1.0];
}
然后调用 reloadTableViewDataSource(TableViewController 的)方法:
- (void)reloadTableViewDataSource
{
[dataSyncManager getEntriesFromServer];
}
dataSyncManager 是我的共享实例。
在 dataSyncManager 的 getEntriesFromServer 方法中,我使用不同的同步项进行循环并每次调用
[[NSNotificationCenter defaultCenter]
postNotificationName:@"ServerQueueProgress"
object:progress];
作为 NSNumber 的适当进度(该部分运行良好)。该消息现在由我的 ViewController 发送和捕获(它有效,我检查了一个断点,它还获得了正确的 progress-NSNumber 并将其转换为浮点数):
- (void)serverQueueProgress:(NSNotification *)notification {
if(![NSThread isMainThread])
{
[self performSelectorOnMainThread:_cmd withObject:notification waitUntilDone:NO];
return;
}
[queueProgressView setProgress:[[notification object] floatValue]];
}
这是我在 stackoverflow 上找到的一种解决方案。但是 if 总是被跳过,因为显然我在主线程上。
不幸的是 UIProgressview 没有得到更新,它只是挂起,但我在 Interface Builder 中很好地连接了它(我通过在 ViewController 的另一个方法中设置进度来检查它。
我还尝试用我的 TableViewController 捕获通知并放入一些其他解决方案,但没有机会, UIProgressView 不会实时更新。只有在同步完成后。
这是 TableViewController 中提到的代码,它也可以正确执行(我还逐步执行以确保每一行都执行良好):
这是收到通知时调用的方法:
- (void)serverQueueProgress:(NSNotification *)notification {
[self performSelectorOnMainThread:@selector(updateProgress:) withObject:[notification object] waitUntilDone:NO];
[serverQueueProgressView setProgress:[[notification object] floatValue]];
}
这也调用了同一类的 updateProgress::
- (void)updateProgress:(NSNumber *)newProgressValue {
[serverQueueProgressView setProgress:[newProgressValue floatValue]];
}
没有机会。如您所见,我尝试了很多方法并并行实施了一些方法,但是 ProgressView 不会实时更新。仅在同步结束时。我究竟做错了什么??
编辑:这是我的 getEntriesFromServer 和 DataSyncManager 中的一些其他内容:
- (void)getEntriesFromServer
{
[[NSNotificationCenter defaultCenter]
postNotificationName:@"SynchingStarted"
object:nil];
[self completeServerQueue];
...
}
并且 completeServerQueue 是使用正确的进度浮点值向我的 ViewController 发送消息的函数(它只是一个虚拟的 for 循环,可以正确执行......我已经检查过了):
- (void)completeServerQueue {
NSNumber *progress = [[NSNumber alloc] init];
for (int i=0; i<15; i++) {
progress = [[NSNumber alloc] initWithFloat:(100/15*i) ];
[[NSNotificationCenter defaultCenter]
postNotificationName:@"ServerQueueProgress"
object:progress];
sleep(1);
}
}