Ken*_*ker 5 objective-c objective-c-blocks nsblockoperation
我是嵌套块,它看起来像UGGGGLY.有没有办法写这个不那么难看?主要是寻找语法建议,而不是结构,但我也会接受.
我的块工厂方法,
-(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];
}
Run Code Online (Sandbox Code Playgroud)
从许多类似于此的函数调用
-(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];
}
Run Code Online (Sandbox Code Playgroud)
queue是一个NSOperationQueue对象.没有所有(丑陋的丑陋)演员,它将无法编译.Amidoinitrite?
编辑:根据Dave DeLong的回答,和http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/,我改变了行
targetView.image = previewImage;
Run Code Online (Sandbox Code Playgroud)
成为,
[targetView performSelectorOnMainThread:@selector(setImage:) withObject:previewImage waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)
用途typedef:
typedef NSImage *(^KWResizerBlock)(CGFloat size, BOOL preview);
Run Code Online (Sandbox Code Playgroud)
这使您的代码成为:
- (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];
}
Run Code Online (Sandbox Code Playgroud)
提醒一句:
您NSBlockOperation将在不是主线程的线程上执行,因此从该上下文中操作任何UI元素是不安全的.如果你需要把它previewImage放到UI上,那么你应该dispatch_async()回到主线程(或者功能相当的东西).
它现在可能有效,但强烈反对,可能会导致未定义的行为.
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |