0

我试图解决这个问题好几天现在我不得不问你......

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

2 回答 2

0

我的猜测是问题不在于您在此处显示的代码,而在于 getEntriesFromServer 中的其他代码。你在使用 NSURLConnection 吗?就像是:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

然后您将获得异步回调,您可以使用它来更新您的进度视图。

于 2011-04-10T00:44:06.657 回答
0

另外,当你遇到麻烦时,把问题分解一下。代替:

[serverQueueProgressView setProgress:[[notification object] floatValue]];

做这个;

float prog = [notification object] floatValue];
[serverQueueProgressView setProgress:prog];

然后调试会给出一个线索,表明这是行不通的。

于 2011-04-11T14:04:23.600 回答