我理解块对象是如何工作的 - 但是我没有遇到过这种类型的块对象,我不确定以下代码是做什么的:
[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];
}
}];
}
如果有人可以提供有关此处发生的事情的解释,我会很高兴。
答案 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 。
您可以订阅在应用中的任何位置接收通知。
答案 2 :(得分:0)
ObjC中的块只是一个回调函数。
在上面的函数localSearch.startWithCompletionHandler中,回调接受两个参数:响应和错误。
当调用此块时,搜索完成后,上面的代码将遍历“响应”中的所有键/值对,并将它们添加到名为self.mapItems的本地键/值映射中。
之后,它会通过NSNotificationCenter发布“发现地址”的通知。
如果错误不是NULL,即提供了指向NSError的指针,它只会发送错误通知消息。
希望这有帮助。
答案 3 :(得分:0)
该方法完成后将运行此块(startWithCompletionHandler:
)
它检查是否没有错误,它将按response.mapItems
循环枚举do while
数组。它获取每个MKMapItem
对象并将其添加到self.mapItems
数组。在所有数组完成后,将发布一个通知(Address Found),因此订阅它的每个对象都将被通知。如果发生错误,将发布通知(未找到)。