对我而言,这是相当多的代码。我理解每个代码部分的部分,但是我无法描述它如何挂起并作为一个整体起作用的逻辑流程,从completionHandler:
方法之后的'^'字符的解释开始。
我可以在这里寻求一些帮助,以较低效的形式重新编写此代码,但效率较低但在视觉上更容易理解?我下载了这段代码,我可以说在程序的上下文中,它是工作代码。
感谢。
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer,
kCGImagePropertyExifDictionary, NULL);
if (exifAttachments) {
NSLog(@"attachements: %@", exifAttachments);
}
else {
NSLog(@"no attachments");
}
NSData *imageData = [AVCaptureStillImageOutput
jpegStillImageNSDataRepresentation:imageSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
[self setStillImage:image];
[image release];
[[NSNotificationCenter defaultCenter]
postNotificationName:kImageCapturedSuccessfully object:nil];
}];
答案 0 :(得分:7)
^
符号表示块的开头。基本上它正在做的是在方法^{
完成之前不会调用块内的代码(从}
到captureStillImageAsynchronouslyFromConnection
)。一旦方法完成捕获图像,它就会执行块内的方法。使用块在Mac和Mac中相对较新。 iPhone世界,但它们可以从许多混乱的委托方法中拯救你,并且通常很棒。起初他们可能看起来令人生畏,但你会很快学会爱他们。
答案 1 :(得分:3)
使用^运算符声明一个 阻止变量并指示 块文字的开头。身体 块本身包含在内 在{}内,如本例所示 (和C一样,表示结束 声明):
您可以在iOS开发人员库的Blocks Programming Topics阅读更多内容。
答案 2 :(得分:1)
表示阻止。当我正在编辑这个答案的时候,我会给我关于积木的文章添加一个链接,这绝对是“傻瓜”...... http://compileyouidontevenknowyou.blogspot.com/2010/07/blocks-in-objective-c.html
基本上captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:
(captureStillImageEtc
,让我们说)接受代码块作为完成处理程序。
此代码将由captureStillImageEtc
方法执行,并将运行大括号({}
)之间定义的代码。
imageSampleBuffer
和error
起作用。块签名定义了当captureStillImageEtc
想要运行块时要传递这些内容(重复,花括号中的代码)。注意:我可能会因此而被投票,但是对于大多数意图和目的来说,块很像指向匿名(或命名)函数的指针。