gpt4 book ai didi

ios - 关于 iOS block 的困惑

转载 作者:行者123 更新时间:2023-11-29 04:35:36 25 4
gpt4 key购买 nike

我不知道如何处理 block 。例如,在我的 viewDidLoad 中,我调用了一个函数“useDocument”来设置 Core Data。我希望一旦 Core Data 准备好使用,就调用另一个函数来处理一些查询。就像 ASIHTTPRequest ,当客户端收到响应时,会调用一个函数来处理响应。

我想触发函数并不是使用 block 的正确方法。但什么是正确的方法呢?

- (void)useDocument
{
if (!self.database) {
self.database = [DataModelDocument sharedDocument];
}

if (![[NSFileManager defaultManager] fileExistsAtPath:[self.database.fileURL path]]) {
// does not exist on disk, so create it
[self.database saveToURL:self.database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (!success) {
NSLog(@"database doesn't exist on disk, we fail to create it");
}
}];
} else if (self.database.documentState == UIDocumentStateClosed) {
// exists on disk, but we need to open it
[self.database openWithCompletionHandler:^(BOOL success) {
if (!success) {
NSLog(@"database exists on disk, but we fail to open it");
}
}];
} else if (self.database.documentState == UIDocumentStateNormal) {
// already open and ready to use
}
}

最佳答案

没有正确的方法来使用 block ,就像没有正确的方法来使用函数一样。

block 是函数。不仅仅是一个功能,但并没有太大不同。所以让我们暂时忘记这些差异。功能。

使用函数,您将编写类似的内容

void callback (BOOL success) {
if (success) {
// do something useful
}
}

[database openWithCallback: &callback];

这里有某种小字节序。差不多。

block 允许您在线编写回调。

[self.database openWithCompletionHandler: ^(BOOL success) {
if (!success) {
// oops, handle that
}
}];

在这种特殊情况下, block 不能解决函数无法解决的任何问题。它们的成本更加均匀。

当您大量使用它们时,好处就会显现出来。如果您将操作编写为完全异步,则可以以简化的方式编写代码。

伪代码:

dispatch block: ^(){
some heavy computation here
dispatch block: ^(){
computation done, update the UI or something
}
}

非常简单的例子。当然,用函数来编写它是完全可能的。但可读性较差。

现在想象一下您正在调度大量的 block ,您可以创建 block 组,然后在组完全执行时执行一个 block 。非常容易写,非常容易读。这开始成为处理到处都是函数指针的噩梦。

现在,是什么让 block 不仅仅是一个函数?

block 是一个函数。有上下文。 block 可以访问同一范围内的变量。在上面的简单示例中,工作 block 可以访问调用范围,完成 block 可以访问调用范围和工作 block 范围。当然,这可以通过函数和结构来完成。代码很多,阅读起来更加困难。 block 更优雅地解决了这个问题。

我建议您阅读有关 Grand Central Dispatch 的内容。这显然是 block 展示其真正潜力和表现力的地方。

关于ios - 关于 iOS block 的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11093933/

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