gpt4 book ai didi

ios - 从 objective-c 中的主线程返回值

转载 作者:可可西里 更新时间:2023-11-01 05:01:44 26 4
gpt4 key购买 nike

我正在开发一个需要在后台线程中构建一些图像的应用程序。在此过程中的某个时刻,我需要从 UITextView 获取文本。如果我调用 UITextview.text,我会收到警告,我的辅助线程不应该纠缠 UIKit

一切都很好,但我需要文本,但我无法找到从主线程获取所述文本的合理方法。

我的问题是:有没有人想出一个从后台线程获取 UI 元素属性的好方法,或者从一开始就避免这样做的好方法?

我把这个东西放在一起,它成功了,但感觉不太对:

@interface SelectorMap : NSObject

@property (nonatomic, strong) NSArray *selectors;
@property (nonatomic, strong) NSArray *results;

@end


@interface NSObject (Extensions)
- (NSArray *)getValuesFromMainThreadWithSelectors:(SEL)selector, ...;
- (void)performSelectorMap:(SelectorMap *)map;
@end

和实现:

#import "NSObject+Extensions.h"

@implementation SelectorMap
@synthesize selectors;
@synthesize results;
@end

@implementation NSObject (Extensions)

- (void)performSelectorMap:(SelectorMap *)map
{
NSMutableArray *results = [NSMutableArray arrayWithCapacity:map.selectors.count];

for (NSString *selectorName in map.selectors)
{
SEL selector = NSSelectorFromString(selectorName);
id result = [self performSelector:selector withObject:nil];
[results addObject:result];
}

map.results = results.copy;
}

- (NSArray *)getValuesFromMainThreadWithSelectors:(SEL)selector, ...
{
NSMutableArray *selectorParms = [NSMutableArray new];

va_list selectors;
va_start(selectors, selector);

for (SEL selectorName = selector; selectorName; selectorName = va_arg(selectors, SEL))
[selectorParms addObject:NSStringFromSelector(selectorName)];

va_end(selectors);

SelectorMap *map = [SelectorMap new];
map.selectors = selectorParms.copy;

[self performSelectorOnMainThread:@selector(performSelectorMap:) withObject:map waitUntilDone:YES];

return map.results;
}

@end

我这样调用它:

NSArray *textViewProperties = [textView getValuesFromMainThreadWithSelectors:@selector(text), @selector(font), nil];

获取字体不会给出与获取文本相同的警告,但我认为最好保持一致。

最佳答案

我尽可能避免任何类型的元编程。它完全破坏了编译器在开始时仔细检查您的代码的能力,并且它往往不可读。

 __block NSString* foo;
dispatch_sync(dispatch_get_main_queue(), ^{
foo = [textField ...];
});

请注意,如果不使用 ARC,您可能需要复制保留 block 中的字符串,然后释放autorelease 在您的本地线程中。

关于ios - 从 objective-c 中的主线程返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14309458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com