gpt4 book ai didi

iphone - connectionDidFinishLoading - 如何强制更新 UIView?

转载 作者:行者123 更新时间:2023-12-03 21:24:20 25 4
gpt4 key购买 nike

我可以从互联网下载 ZIP 文件。后处理在connectionDidFinishLoading 中完成,并且工作正常,但没有更新UIView 元素。例如,我设置了 statusUpdate.text = @"Uncompressing file"但该更改直到 connectionDidFinishLoading 完成后才会出现。同样,UIProgressView 和 UIActivityIndi​​catorView 对象在该方法结束之前不会更新。

有什么方法可以在这个方法中强制更新 UIView 吗?我尝试设置 [self.view setNeedsDisplay] 但这不起作用。它似乎在主线程中运行。这里的所有其他命令都可以正常工作 - 唯一的问题是更新 UI。

谢谢!

更新:这是不更新 UIVIEW 的代码:

-(void)viewWillAppear:(BOOL)animated {
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(processUpdate:) userInfo:nil repeats:YES];
downloadComplete = NO;
statusText.text = @"";

}

-(void)processUpdate:(NSTimer *)theTimer {
if (! downloadComplete) {
return;
}

[timer invalidate];
statusText.text = @"Processing update file.";
progress.progress = 0.0;
totalFiles = [newFiles count];
for (id fileName in newFiles) {
count++;
progress.progress = (float)count / (float)totalFiles;
// ... process code goes here ...
}
}

在 processUpdate 结束时,我设置 downloadComplete = YES。此构建和运行不会出现错误,并且按预期工作,除了在 processUpdate 完成之前 UIVIEW 中没有任何更新,然后所有内容都会立即更新。

感谢您迄今为止的帮助!

最佳答案

正如 Niels 所说,如果您想看到 View 更新,则必须将控制权返回给运行循环。但除非确实需要,否则不要开始分离新线程。我推荐这种方法:

- (void)connectionDidFinishLoading:(NSConnection *)connection {
statusUpdate.text = @"Uncompressing file";
[self performSelector:@selector(doUncompress) withObject:nil afterDelay:0];
}

- (void)doUncompress {
// Do work in 100 ms chunks
BOOL isFinished = NO;
NSDate *breakTime = [NSDate dateWithTimeIntervalSinceNow:100];
while (!isFinished && [breakTime timeIntervalSinceNow] > 0) {
// do some work
}
if (! isFinished) {
statusUpdate.text = // here you could update with % complete
// better yet, update a progress bar
[self performSelector:@selector(doUncompress) withObject:nil afterDelay:0];
} else {
statusUpdate.text = @"Done!";
// clean up
}
}

基本思想是你要分小块进行工作。您从方法返回以允许运行循环定期执行。对 PerformSelector: 的调用将确保控制权最终返回到您的对象。

请注意,这样做的风险是用户可能会按您可能意想不到的方式按下按钮或与 UI 交互。在您工作时调用 UIApplication 的 beginIgnoringInteractionEvents 来忽略输入可能会有所帮助...除非您想表现得很好并提供一个取消按钮来设置您在 中 checkin 的标志doUncompress 方法...

您也可以尝试自己运行运行循环,经常调用[[NSRunLoop currentRunLoop] runUntilDate:...],但我从未在自己的代码中尝试过这样做。

关于iphone - connectionDidFinishLoading - 如何强制更新 UIView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com