Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如果事件是自生成的,如何实现基于事件的状态机?_Objective C_Ios - Fatal编程技术网

Objective c 如果事件是自生成的,如何实现基于事件的状态机?

Objective c 如果事件是自生成的,如何实现基于事件的状态机?,objective-c,ios,Objective C,Ios,是否有一种推荐的方法来实现一系列活动,以使应用程序保持响应,但这些活动不会以嵌套方式链接在一起,也不会使用线程 让我试着解释一下——假设我有一个模型类,它使用一个downloader类来下载一个zip文件,然后当它下载时,模型会解压文件,然后对解压后的文件进行处理 现在,如果downloader类通过如下委托通知model类下载已就绪: 在downloader类中: - (void) connectionDidFinishLoading:(NSURLConnection *)connection

是否有一种推荐的方法来实现一系列活动,以使应用程序保持响应,但这些活动不会以嵌套方式链接在一起,也不会使用线程

让我试着解释一下——假设我有一个模型类,它使用一个downloader类来下载一个zip文件,然后当它下载时,模型会解压文件,然后对解压后的文件进行处理

现在,如果downloader类通过如下委托通知model类下载已就绪:

在downloader类中:

- (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
和三个长期运行的方法中设置了一些状态检查和回调,那么您可以随时取消。我把答案编辑了一下,这样你就能明白我的意思了。