【发布时间】:2012-01-10 15:20:50
【问题描述】:
我有一个方法,我想在其中完成给定的任务,但是异步命令和委托使其变得困难
我可以做到:
- (void) fooPart1
{
...
SomeAssynchronousMethos * assync = [[SomeAssynchronousMethos alloc] init];
assync.delegate = self;
[assync start];
}
- (void) fooPart2
{
...
possibly some other assync
}
- (void)someAssynchronousMethosDelegateDidiFinish
{
[self fooPart2];
}
但是没有办法做史密斯。像这样
- (void) foo
{
...
SomeAssynchronousMethos * assync = [[SomeAssynchronousMethos alloc] init];
assync.delegate = self;
[assync start];
wait for signal, but class is not blocked
...
possibly some other assync
}
- (void)someAssynchronousMethosDelegateDidiFinish
{
continue in foo after [assync start]
}
我不喜欢将函数拆分为 2 个或更多部分的想法,但这是在 cocoa 中完成的方式吗?还是有更好的做法?
为什么我不喜欢这个概念并寻找更好的方法:
- 可以说,我只想使用一个变量来完成一项任务 - 如果我在一个函数中拥有所有内容,我只需使用它,然后当我离开函数时 var 死掉,如果它拆分,我必须保留var 不知何故,直到它没有完成
- 代码变得支离破碎,更难阅读和维护
- 可能会导致错误
- 我最终得到了一组部分函数,需要以精确的顺序调用以完成一项任务(其中一个函数更适合)
我曾经创建一个线程并且在那里只做同步调用,但不是所有东西都支持同步调用
真正的好,就是拥有某种东西,比如
- (void) foo
{
...
int smth = 5;
SomeAssynchronousMethos * assync = [[SomeAssynchronousMethos alloc] init];
assync.delegate = self;
@freez([assync start]);
// when freez - the local function variables are frozen
// (next commands in function are not excuted until unfreez)
// from outer look, it looks like the function finished
// however when unfreeze, it is called from this point on
//int smth is still 5
}
- (void)someAssynchronousMethosDelegateDidiFinish
{
@unfreez([assync start]);
}
当执行到达冻结时,它将存储在函数中分配的所有本地变量,当调用 unfreez 时,它将从该点继续,当它被该命令冻结时
【问题讨论】:
-
我很困惑。启动一个真正的异步任务不应该阻塞,所以应该可以用一种方法来完成。话虽如此,方法应该完成一件事,所以首先是编写更好的代码。
-
是的,问题是当启动一个真正的异步任务时,该函数会继续,但是我希望真正的异步任务启动,但是,当它完成时,它会从它被调用的地方继续(像同步调用),所以我的函数没有分成 x 部分
-
异步任务的全部意义在于继续执行。将代码拆分为不同的方法/块以在任务完成之前和之后调用是一件好事,而不是一件坏事。也许如果您发布更多代码,我们就会明白为什么拆分您的方法是如此不可取。
-
好吧,我希望我的函数执行一个完整的任务,而不是跨多个部分函数关闭此任务(部分函数在不按精确顺序执行时不起作用 - 我不知道,但我喜欢这是一个糟糕的概念)......此外,如果我想使用函数第 1 部分中的变量,我必须保留它(全局),直到函数的第 2 部分开始播放
-
有很多方法可以确保任务以正确的顺序完成,甚至是异步的。您当然不必在全局范围内保留变量。使用对象及其提供的封装。没有更多细节,任何人都很难提供帮助,但我强烈怀疑你的坚持更多是基于缺乏想法,而不是最好的设计。有了更多的细节,人们可以提出更优化的设计模式。例如,请注意下面 JeremyP 的回答。在停止的地方继续执行和调用完成处理程序块之间没有区别。
标签: objective-c cocoa coding-style