gpt4 book ai didi

objective-c - 从 UIAlertViewDelegate 回调返回后台线程

转载 作者:行者123 更新时间:2023-12-01 19:16:26 25 4
gpt4 key购买 nike

我有一个从文件中读取的导入序列,解压缩包含的文件并为每个文件创建相应的核心数据实体。这整个过程发生在后台,并且已经为每个线程等创建了一个单独的上下文,所以一切正常。

事实证明,这个特定导入序列的一个理想特性是我们允许任何输入文件受密码保护(其中有几个包含在存档中)所以我需要检查文件是否受密码保护在这种情况下系统将提示用户通过 UIAlertView 输入密码.

这就是我的问题开始的地方。

我发送 UIAlertView提示主线程,分配我的 Importer object作为 delegate并等待用户输入。

当用户输入密码并点击 OK/Cancel 时,委托(delegate)回调仍在主线程上,因此如果没有大量工作(即存储对托管对象 ID 的引用等,创建新的),我将无法再操作相应的核心数据实体上下文等)。

我的问题:

是否可以返回正在执行导入过程的原始后台线程?我该怎么办?

谢谢,
罗格

最佳答案

我会尝试使用 dispatch semaphore .将其保存在实例变量中。

@interface MyClass ()
{
dispatch_semaphore_t dsema;
}
@end

然后,在后台线程方法中:
// this is the background thread where you are processing the archive files
- (void)processArchives
{
...
self.dsema = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: @"Title"
...
delegate: self
...
];
[alertView show];
});

dispatch_semaphore_wait(self.dsema, DISPATCH_TIME_FOREVER);
// --> when you get here, the user has responded to the UIAlertView <--

dispatch_release(self.dsema);
...
}
UIAlertView将调用此委托(delegate)方法:
// this is running on the main queue, as a method on the alert view delegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// do stuff with alertView
if (buttonIndex == [alertView firstOtherButtonIndex]) {
...
// when you get the reply that should unblock the background thread, unblock the other thread:
dispatch_semaphore_signal(self.dsema);
...
}
}

关于objective-c - 从 UIAlertViewDelegate 回调返回后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12965946/

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