gpt4 book ai didi

objective-c - Cocoa 与代表进行应用程序的方式

转载 作者:行者123 更新时间:2023-12-03 16:55:15 24 4
gpt4 key购买 nike

我有一个方法,我想在其中完成给定的任务,但是,异步命令和委托(delegate)使它变得困难

我能做到:

- (void) fooPart1 
{
...
SomeAssynchronousMethos * assync = [[SomeAssynchronousMethos alloc] init];
assync.delegate = self;
[assync start];

}

- (void) fooPart2
{
...
possibly some other assync
}

- (void)someAssynchronousMethosDelegateDidiFinish
{
[self fooPart2];
}

但是有没有办法做到 smith.像这样

- (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 以某种方式围绕,直到它没有完成
  • 代码变得支离 splinter ,更难以阅读和维护
  • 可能会导致错误
  • 我最终得到了一组部分函数,​​需要以精确的顺​​序调用它们来完成一项任务(一个函数更适合)

我曾经创建一个线程,只在那里进行同步调用,但并不是所有东西都支持同步调用

真正好的事情是拥有一些东西,比如

- (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]);
}

当执行到达 freez 时,它将存储在函数中分配的所有本地变量,并且当调用 unfreez 时,当使用该命令卡住它时,它将从该点继续

最佳答案

这似乎是完成处理程序的理想应用 block .

更改您的 start 方法以获取一个 block 参数并像这样调用它:

- (void) fooPart1 
{
...
SomeAssynchronousMethos * assync = [[SomeAssynchronousMethos alloc] init];
[assync startOnComplete: ^(NSError* error) // example, you can have any params or none
{
// handle error if not nil
if (error != nil)
{
// do something with it
}
// code to do on completion
}];
}

你的启动方法看起来像这样

-(void) startOnComplete: (void(^)(NSError*)) completionBlock
{
// copy the block somewhere
theSavedCompletionBlock = [completionBlock copy];
// kick off async operation
}

-(void) someMethodThatRunsAttheEndOfTheAsyncOp
{
theSavedCompletionBlock(nilOrError);
[theSavedCompletionBlock release];
}

关于objective-c - Cocoa 与代表进行应用程序的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8805633/

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