Objective c 如果事件是自生成的,如何实现基于事件的状态机?
是否有一种推荐的方法来实现一系列活动,以使应用程序保持响应,但这些活动不会以嵌套方式链接在一起,也不会使用线程 让我试着解释一下——假设我有一个模型类,它使用一个downloader类来下载一个zip文件,然后当它下载时,模型会解压文件,然后对解压后的文件进行处理 现在,如果downloader类通过如下委托通知model类下载已就绪: 在downloader类中:Objective c 如果事件是自生成的,如何实现基于事件的状态机?,objective-c,ios,Objective C,Ios,是否有一种推荐的方法来实现一系列活动,以使应用程序保持响应,但这些活动不会以嵌套方式链接在一起,也不会使用线程 让我试着解释一下——假设我有一个模型类,它使用一个downloader类来下载一个zip文件,然后当它下载时,模型会解压文件,然后对解压后的文件进行处理 现在,如果downloader类通过如下委托通知model类下载已就绪: 在downloader类中: - (void) connectionDidFinishLoading:(NSURLConnection *)connection
- (void) connectionDidFinishLoading:(NSURLConnection *)connection {
// ...
[self.delegate zipFileDownloadingCompleted];
}
在模型类中:
- (void) zipFileDownloadingCompleted {
[self unzipFile];
[self doSomethingElseWithFile];
[self doSomeOtherStuff];
}
但是,如果unZipFile和doSomethingElseWithFile以及doSomeOtherStuff可能是使用异步API的冗长活动,那么模型类可能会将它们分开,并且只在调用了unZipFile上的委托后调用doSomethingElseWithFile,并且仅在对doSomeThingleSeWithFile等调用委托后调用doSomeOtherStuff。
但这是一种有效的方法吗?在我看来,一切都是链接在一起的,而且仍然是同步的
如何将unZipFile和doSomeThingleWithFile和doSomeOtherStuff分解为单独的活动块?应用程序是否可能在一个活动结束时跳出运行循环,然后跳回进行下一个活动
如果您熟悉Brew,那么我的意思是通过调用HandleEvent()在一次运行期间执行一个活动,然后自行安排一个事件,以便再次调用HandleEvent()来处理下一个活动,依此类推,这样应用程序始终保持响应
如果可能的话,我想避免使用线程,我认为基于事件的编码比线程更简单,更不容易出错
我不知道我是否解释得很好,希望你能理解要点。一种方法是使用
performSelectorInBackground:withObject
异步执行长时间运行的任务。您可以按如下方式替换代理的zipfiledownloadtompled
:
- (void) zipFileDownloadCompleted {
[self performSelectorInBackground:@selector(processAsync) withObject:nil];
}
- (void) processAsync {
if (!interrupt) {
[self unzipFile];
[self doSomethingElseWithFile];
[self doSomeOtherStuff];
}
}
然后在每个长时间运行的子任务中:
- (void) unzipFile {
if (!interrupt) {
...
}
}
我知道你想避免线程,但这是最简单的
您可以决定在这三种方法中进行回调,以提醒您出现错误情况;在启动每个步骤以彻底失败之前,您需要通过检查来增强
processAsync
,以此类推。请参阅编辑的示例中的中断内容(当然,您会使用比全局中断更健壮、更易于管理和更安全的东西)。您可能正在查找-[nsrunlop performSelector:target:argument:order:modes:][/code>()。我想了解更多信息,特别是布拉德·拉森,他知道自己的东西。performSelectorInBackground执行的功能在启动后是否可以取消,如果需要在执行结束前中断功能?@BiscutWoofington如果您设置它,那么可以。答案的最后一段暗示了这一点,但基本上,如果您在processAsync
和三个长期运行的方法中设置了一些状态检查和回调,那么您可以随时取消。我把答案编辑了一下,这样你就能明白我的意思了。