2011-01-19 14 views
5

Sono blocchi di nidificazione e sembra UGGGGLY. C'è un modo per scrivere questo meno brutto? Principalmente cercando suggerimenti per la sintassi, piuttosto che strutturali, ma accetterò entrambi.Sintassi/formattazione durante l'annidamento dei blocchi obiettivo-c

Il mio metodo di blocco fabbrica,

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

} 

che viene chiamato da un certo numero di funzioni simili a questo,

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

coda è un oggetto NSOperationQueue. Non si compilerà senza tutto il cast (brutto brutto). Amidoinitrite?

Edit: Come per la risposta di Dave DeLong, e http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/, ho cambiato la linea

targetView.image = previewImage; 

di essere,

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

@Jesse, l'uomo non ama odiare, apprezzare. –

+0

Haha è la mia lingua "principale", quindi non stavo odiando solo scherzando. Per quanto riguarda il codice ... sembra più bello possibile con i blocchi in cui credo, ma non è davvero un esperto. –

+0

È '[auto resizeBlock]' chiamato da qualche altra parte nel tuo programma, o solo nel metodo 'queueResize: toView:'? –

risposta

6

Uso typedef:

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

questo rende il vostro codice diventato:

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

Una parola di cautela:

tuo NSBlockOperation sta per essere in esecuzione su un thread che non è il thread principale, e così non è sicuro di manipolare qualsiasi elemento dell'interfaccia utente all'interno di quel contesto. Se hai bisogno di inserire l'interfaccia previewImage nell'interfaccia utente, devi riportare il dispatch_async() al thread principale (o qualcosa di funzionalmente equivalente).

Potrebbe funzionare in questo momento, ma è fortemente scoraggiare e può portare a un comportamento non definito.

+0

Questo è ottimo, e puoi anche accorciare il primo metodo copiando e rilasciando un blocco anonimo; non devi nemmeno dichiararlo per primo. –

+0

@itaiferber si, ma trovo che sia molto più facile per gli occhi non invocare metodi su un blocco come parte della loro creazione. Solo la mia preferenza –

+0

Questa è una risposta fantastica. Grazie mille! –

Problemi correlati