我试着解决这个问题好几天了,我现在要问你......
我有一个带有UITableview的View(和一个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是我的sharedInstance。
在dataSyncManager的getEntriesFromServer方法中,我使用不同的同步项进行循环并每次调用
[[NSNotificationCenter defaultCenter]
postNotificationName:@"ServerQueueProgress"
object:progress];
作为NSNumber的适当进展(该部分运作良好)。该消息现在由我的ViewController发送和捕获(它工作,我检查了一个断点,它也得到了正确的进展 - 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捕获Notification并添加一些其他解决方案,但没有机会,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);
}
}
答案 0 :(得分:0)
我猜这个问题不是你在这里展示的代码,而是getEntriesFromServer中的其他代码。你在使用NSURLConnection吗?类似的东西:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
然后您将异步获得回调,以便更新进度视图。
答案 1 :(得分:0)
另外,当你遇到麻烦时,请稍微解决问题。而不是:
[serverQueueProgressView setProgress:[[notification object] floatValue]];
这样做;
float prog = [notification object] floatValue];
[serverQueueProgressView setProgress:prog];
然后调试会给出一个不起作用的线索。