首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套objective-c块时的语法/格式

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

Stack Overflow用户
提问于 2011-01-20 05:49:32
回答 1查看 880关注 0票数 5

我正在嵌套块,它看起来像UGGGGLY。有没有一种方法可以写得不那么难看?主要是寻找语法建议,而不是结构建议,但我都会接受。

我的块工厂方法,

代码语言:javascript
复制
-(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];

}

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

代码语言:javascript
复制
-(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/,我更改了这行

代码语言:javascript
复制
targetView.image = previewImage;

成为,

代码语言:javascript
复制
[targetView performSelectorOnMainThread:@selector(setImage:) withObject:previewImage waitUntilDone:YES];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-20 06:35:30

使用typedef

代码语言:javascript
复制
typedef NSImage *(^KWResizerBlock)(CGFloat size, BOOL preview);

这会使你的代码变成:

代码语言:javascript
复制
- (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()返回到主线程(或者在功能上等效的东西)。

它现在可能可以工作,但它是强烈的不鼓励,并可能导致未定义的行为。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4741191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档