gpt4 book ai didi

objective-c - 嵌套 objective-c block 时的语法/格式

转载 作者:太空狗 更新时间:2023-10-30 03:51:33 24 4
gpt4 key购买 nike

我在嵌套积木,它看起来很难看。有没有办法把这个写得不那么难看?主要是寻找语法建议,而不是结构建议,但我会接受其中任何一个。

我的 block 工厂方法,

-(NSImage *(^)(CGFloat size, BOOL preview))resizeBlock {

return (NSImage *(^)(CGFloat size, BOOL preview))[[^(CGFloat size, BOOL preview){
// image-resizing code
return [[[NSImage alloc] init] autorelease];
} copy] autorelease];

}

从许多与此类似的函数中调用,

-(void)queueResize:(CGFloat)targetSize toView:(NSImageView *)targetView {
NSImage*(^sizeBlock)(CGFloat,BOOL) = [self resizeBlock];
NSBlockOperation *bo = [NSBlockOperation blockOperationWithBlock:^(void) {
NSImage *previewImage = (NSImage*)sizeBlock(targetSize,YES);
targetView.image = previewImage;
}];
[queue addOperation:bo];
}

queue 是一个 NSOperationQueue 对象。如果没有所有(丑陋的)类型转换,它就不会编译。氨基亚硝酸盐?

编辑:根据 Dave DeLong 的回答,和 http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/ , 我改线了

targetView.image = previewImage;

成为,

[targetView performSelectorOnMainThread:@selector(setImage:) withObject:previewImage waitUntilDone:YES];

最佳答案

使用typedef:

typedef NSImage *(^KWResizerBlock)(CGFloat size, BOOL preview);

这会让你的代码变成:

- (KWResizerBlock) resizeBlock {
KWResizerBlock block = ^(CGFloat size, BOOL preview){
// image-resizing code
return [[[NSImage alloc] init] autorelease];
};
return [[block copy] autorelease];
}

-(void)queueResize:(CGFloat)targetSize toView:(NSImageView *)targetView {
KWResizerBlock sizeBlock = [self resizeBlock];
NSBlockOperation *bo = [NSBlockOperation blockOperationWithBlock:^{
NSImage *previewImage = sizeBlock(targetSize, YES);
//do something with previewImage
}];
[queue addOperation:bo];
}

请注意:

您的 NSBlockOperation 将在非主线程的线程上执行,因此从该上下文中操作任何 UI 元素都是不安全的。如果您需要将 previewImage 放到 UI 上,那么您应该将 dispatch_async() 返回到主线程(或功能等效的东西)。

它现在可能会起作用,但它强烈不鼓励并可能导致未定义的行为。

关于objective-c - 嵌套 objective-c block 时的语法/格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4741191/

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