UIProgressView更新失败,UINotification

时间:2011-04-09 20:17:59

标签: iphone objective-c ios uiprogressview

我试着解决这个问题好几天了,我现在要问你......

我有一个带有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);
    }
}

2 个答案:

答案 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];

然后调试会给出一个不起作用的线索。