gpt4 book ai didi

objective-c - 如何实现事件自行生成的基于事件的状态机?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:54:15 26 4
gpt4 key购买 nike

是否有推荐的方法来实现一系列事件,使应用程序保持响应,但事件不会以嵌套方式全部链接在一起并且不使用线程。

让我尝试解释一下 - 假设我有一个模型类,它使用下载器类来下载 zip 文件,然后在下载时模型解压缩文件,然后对解压缩的文件执行一些操作。

现在,如果下载器类通过这样的委托(delegate)通知模型类下载已准备就绪:

在下载器类中:

- (void) connectionDidFinishLoading:(NSURLConnection *)connection  {
// ...
[self.delegate zipFileDownloadingCompleted];
}

在模型类中:

- (void) zipFileDownloadingCompleted  {
[self unzipFile];
[self doSomethingElseWithFile];
[self doSomeOtherStuff];
}

但是如果 unZipFile 和 doSomethingElseWithFile 和 doSomeOtherStuff 可能是使用异步 API 的冗长事件,那么模型类可能会将它们分开,并且只在调用 unzipFile 上的委托(delegate)后才调用 doSomethingElseWithFile,并且只在调用委托(delegate)后调用 doSomeOtherStuff调用 doSomethingElseWithFile 等等。但这是一种有效的方法吗,在我看来一切都链接在一起并且仍然是同步的。

如何将 unZipFile 和 doSomethingElseWithFile 以及 doSomeOtherStuff 分解为单独的事件 block ?应用程序是否有可能让自己在一个事件结束时跳出运行循环,然后跳回执行下一个事件?

如果您熟悉 Brew,那么我的意思是在一次运行期间通过 HandleEvent() 调用执行一个事件,然后自行安排一个事件,以便再次调用 HandleEvent() 以处理下一个事件等等 - 所以应用程序始终保持响应。

我想尽可能避免使用线程,我认为基于事件的编码比线程更不复杂,也更不容易出错。

我不知道我是否解释得很好,希望你明白了要点。

最佳答案

一种方法是使用 performSelectorInBackground:withObject 异步执行长时间运行的任务。您可以按如下方式替换委托(delegate)的 zipFileDownloadCompleted:

- (void) zipFileDownloadCompleted {
[self performSelectorInBackground:@selector(processAsync) withObject:nil];
}

- (void) processAsync {
if (!interrupt) {
[self unzipFile];
[self doSomethingElseWithFile];
[self doSomeOtherStuff];
}
}

然后在每个长时间运行的子任务中:

- (void) unzipFile {
if (!interrupt) {
...
}
}

我知道您想避免使用线程,但这很容易。

您可以决定在这三个方法中放置回调以提醒您错误情况;在启动每个步骤以彻底失败之前,您需要通过检查来加强 processAsync,等等。请参阅编辑示例中的 interrupt 内容(当然,您会使用比全局更健壮、更易于管理和更安全的内容。)

关于objective-c - 如何实现事件自行生成的基于事件的状态机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609436/

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