2011-01-19 16 views
5

Yuvaları yerleştiriyorum ve UGGGGLY görünüyor. Bunu daha az çirkin yazmanın bir yolu var mı? Çoğunlukla yapısal değil, sözdizimi önerileri arıyorum, ama ben de kabul edeceğim. Nesne-c bloklarını yerleştirirken sözdizimi/biçimlendirmesi

My blok fabrika yöntemi

, buna benzer fonksiyonları bir dizi denir

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

kuyruğu bir NSOperationQueue nesnesidir. Tüm (çirkin çirkin) döküm olmadan derleme yapmaz. Amidoinitrite?

Düzenleme: Dave DeLong cevabı gereğince ve http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/, ben

targetView.image = previewImage; 

olmak hattı,

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

@Jesse, adam playa nefret etmiyor, takdir et. –

+0

Haha benim 'ana' dilim, bu yüzden sadece şaka yapmıyordum. Kod kadarıyla ... inanıyorum ama gerçekten bir uzman değil, blokları kullanabileceği kadar güzel görünüyor. –

+0

'[self resizeBlock]', programınızda başka bir yerde veya 'queueResize: toView:' yönteminde çağrılır mı? –

cevap

6

Kullanım typedef değiştirdi:

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

Bu nizin daha kod:

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

Tek kelime: Sizin NSBlockOperation

ana iş parçacığı olmayan bir iş parçacığı üzerinde yürütülmesi olacak ve böylece bağlam içinde herhangi UI öğesi işlemek için güvenli değildir. previewImage'u UI'ye yerleştirmeniz gerekiyorsa, dispatch_async()'u ana iş parçacığına (veya işlevsel olarak eşdeğer bir öğeye) geri vermelisiniz.

Şu anda çalışabilir, ancak kesinlikle cesaret kırıcıdır ve tanımlanmamış davranışlara yol açabilir.

+0

Bu harika ve anonim bir bloğu kopyalayıp bırakarak ilk yöntemi bile kısaltabilirsiniz; İlk önce bildirmen bile gerekmiyor. –

+0

@itaiferber evet, ama gözler üzerinde yaratılışlarının bir parçası olarak bir blok üzerinde yöntemleri çağırmamak için daha kolay buluyorum. Sadece benim tercihim. –

+0

Bu harika bir cevap. Çok teşekkürler! –

İlgili konular