2011-01-19 4 views
5

ブロックを入れ子にしていて、UGGGGLYのように見えます。これはあまりにも醜い書き込む方法はありますか?主に構造的ではなく、構文の提案を探していますが、どちらでも受け入れます。 objective-cブロックのネスト時の構文/書式

マイブロックファクトリメソッド

、これに似た機能の数から呼び出され

-(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]; 
} 

キューがNSOperationQueueオブジェクトです。それはすべての(醜い醜い)鋳造なしではコンパイルされません。アミドイitライト?

編集:デイブ・デロングの答えを1として 、およびhttp://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/、私が使用typedef

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

@Jesse、man do not playa hate、appreciate。 –

+0

母は私の「メイン」言語なので、ただ冗談を言うのを嫌っていませんでした。限り、コードとして...それは私が信じるブロックを使用することができるようにかなり見えるが、実際にはエキスパートではない。 –

+0

'[self resizeBlock]'はあなたのプログラムのどこか、あるいは 'queueResize:toView:'メソッドのどこかで呼び出されますか? –

答えて

6

、するラインに

targetView.image = previewImage; 

を変更:

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()をメインスレッド(または機能的に同等のもの)に戻す必要があります。

今のところうまくいくかもしれませんが、が強く、未定義の動作につながる可能性があります。

+0

これは素晴らしいことです。匿名ブロックをコピーして解放することで、最初のメソッドを短くすることもできます。最初に宣言する必要はありません。 –

+0

@itaiferberええ、私は、ブロック上のメソッドを作成の一部として呼び出さないほうが目がはるかに簡単だと分かります。ちょうど私の好み。 –

+0

これはすばらしい答えです。本当にありがとう! –