gpt4 book ai didi

iphone - 正在调用 -[NSRunLoop runUntilDate :] a good idea?

转载 作者:技术小花猫 更新时间:2023-10-29 11:22:48 26 4
gpt4 key购买 nike

调用 -[NSRunLoop runUntilDate:] 通常是个好主意吗?它似乎没有任何问题,但告诉运行循环从运行循环内部运行让我很紧张。

更多信息:

我现在有一个项目正在从 REST 服务中获取数据。需要获取的一项关键信息是具有有效数据的日期范围。这是只需要获取一次的非常小的数据,因此我决定最好的处理方法是让属性在局部变量为 nil 时下载数据。我正在使用 ASIHTTPRequest 和一个 ASINetworkQueue,所以默认情况下一切都是异步的,为了让它工作,这个属性在数据下载完成之前不能返回并进行了处理。这是我的代码大纲,变量的名称已更改以保护无辜者:

__block BOOL isWorking = YES;
__block ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:/*actual URL*/] autorelease];
[request setCompletionBlock:^{
// set local variable
isWorking = NO;
}];
[request setFailedBlock:^{
// show alert to user
isWorking = NO;
}];
[queue addOperation:request];

while (isWorking) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}

同样,这似乎工作正常。使用这种方法是否存在任何潜在问题?

最佳答案

显示某种微调器并将其拆下以响应来自网络代码的异步完成事件不是更好吗?喜欢:

[self displayLoadingSpinner];
[request setCompletionBlock:^{
[self handleSuccess];
dispatch_async(dispatch_get_main_queue(), ^{
[self hideLoadingSpinner];
}];
}];
[request setFailedBlock:^{
[self handleFailure];
dispatch_async(dispatch_get_main_queue(), ^{
[self hideLoadingSpinner];
}];
}];
[queue addOperation:request];

我认为这比运行循环更好。但可能您已经知道这一点,只是想知道 runloop 解决方案中存在哪些确切的缺点?


如果你想阻塞直到值准备好,你可以使用信号量:

dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[request setCompletionBlock:^{
dispatch_semaphore_signal(sem);
}];
[queue addOperation:request];

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_release(sem);

关于iphone - 正在调用 -[NSRunLoop runUntilDate :] a good idea?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923621/

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