块对象需要进一步解释

时间:2013-12-23 12:28:09

标签: ios iphone objective-c anonymous-function

我理解块对象是如何工作的 - 但是我没有遇到过这种类型的块对象,我不确定以下代码是做什么的:

 [localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
        if (!error) {
            int i = 0;
            do {
                MKMapItem *mapItem = [response.mapItems objectAtIndex:i];
                [self.mapItems addObject:mapItem];
                i++;
            } while (i < response.mapItems.count);
            [[NSNotificationCenter defaultCenter] postNotificationName:@"Address Found" object:self];
        } else {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"Not Found" object:self];
        }
    }];
}

如果有人可以提供有关此处发生的事情的解释,我会很高兴。

4 个答案:

答案 0 :(得分:1)

插入符号后面的函数(^)是“块”。 See this post.

localSearch对象将在需要时(完成时)调用下面定义的块(匿名函数)。这就像分配给处理操作结果的委托,但不要求您定义新函数来接收回调。调用类是委托(即self指向函数中的调用者)。

我为具体细节添加了一些评论。

   (MKLocalSearchResponse *response, NSError *error) {
// If there is not an error
        if (!error) {
            int i = 0;
            do {
                MKMapItem *mapItem = [response.mapItems objectAtIndex:i];
// The map items found are added to a mapItems NSMutableArray (presumed) that is 
// owned by the original caller of this function.
                [self.mapItems addObject:mapItem];
                i++;
            } while (i < response.mapItems.count);
// Using the Observer design pattern here.  Some other object must register for the
// @"Address Found" message.  If any were found, it will be called.
            [[NSNotificationCenter defaultCenter] postNotificationName:@"Address Found" object:self];
        } else {
// Using the notification center to announce "not found".  I am not sure if this is correct,
// since this would be the response if there was an error, and not found is not necessarily
// the same as an error occurring.
            [[NSNotificationCenter defaultCenter] postNotificationName:@"Not Found" object:self];
        }

这有用吗?

您试图解决的具体问题是什么?

答案 1 :(得分:0)

您需要记住,有两种不同的技术块和通知。 搜索完成后,在处理完搜索数据并由NSNotification发送后,将调用阻止 startWithCompletionHandler

您可以订阅在应用中的任何位置接收通知。

了解更多信息 NSNotification Class Reference

答案 2 :(得分:0)

ObjC中的块只是一个回调函数。

在上面的函数localSearch.startWithCompletionHandler中,回调接受两个参数:响应和错误。

当调用此块时,搜索完成后,上面的代码将遍历“响应”中的所有键/值对,并将它们添加到名为self.mapItems的本地键/值映射中。

之后,它会通过NSNotificationCenter发布“发现地址”的通知。

如果错误不是NULL,即提供了指向NSError的指针,它只会发送错误通知消息。

希望这有帮助。

答案 3 :(得分:0)

该方法完成后将运行此块(startWithCompletionHandler:) 它检查是否没有错误,它将按response.mapItems循环枚举do while数组。它获取每个MKMapItem对象并将其添加到self.mapItems数组。在所有数组完成后,将发布一个通知(Address Found),因此订阅它的每个对象都将被通知。如果发生错误,将发布通知(未找到)。