gpt4 book ai didi

multithreading - 在后台做一些工作并返回结果

转载 作者:行者123 更新时间:2023-12-04 04:30:07 27 4
gpt4 key购买 nike

我正在尝试使用库从标签中获取 ID。

我想出了以下内容。寻找标签的循环是在后台完成的,我在 tagAsString 中得到了正确的结果。

-(void) readTag {
NSLog(@"readTag");
unsigned char * tagUID = (unsigned char *) malloc(M1K_UID_SIZE * sizeof(char));
//work to do in the background
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
ERR ret;
while ((ret = scanner->IsTagAvailable(tagUID)) != ERR_TAG_AVAILABLE) {
NSLog(@"ret: %d", ret);
}


//main thread
dispatch_async( dispatch_get_main_queue(), ^{
if(ret == ERR_TAG_AVAILABLE) {
NSLog(@"tag available");
NSString *tagAsString = [[[NSString alloc] initWithFormat:@"%x%x%x%x", tagUID[0],tagUID[1],tagUID[2],tagUID[3]] retain];

}
});
});
}

我希望能够返回该值,以便能够调用:
NSString * myTag = [self readTag];

那可能吗 ?
谢谢你的帮助,迈克尔

最佳答案

有可能,但是从该函数返回字符串的问题是,当您在后台执行工作时,它需要暂停您的调用线程 - 因此失去了后台线程的好处。 (dispatch_sync 是您用来执行此操作的 - 但是我不推荐它)。

使用 block 时,最好重新构建程序以更好地适应异步范例。当工作完成时,它应该通过向它发送带有结果的消息来通知正在等待结果的任何人。在您的示例中,您将把它放在您在主队列上调度的代码块中。

@interface TagManager
- (void)fetchTag;
- (void)tagFetched:(NSString *)tag;
@end

@implementation TagManager
- (void)fetchTag {
// The following method does all its work in the background
[someObj readTagWithObserver:self];
// return now and at some point someObj will call tagFetched to let us know the work is complete
}

- (void)tagFetched:(NSString *)tag {
// The tag read has finished and we can now continue
}
@end

然后您的 readTag 函数将被修改为:
- (void)readTagWithObserver:(id)observer {
...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
...
dispatch_async(dispatch_get_main_queue(), ^{
if (tag is ok) {
[observer tagFetched:tag];
}
});
});
}

主要思想是您需要将处理分为两个阶段
  • 请求完成一些工作(在我的示例中为 fetchTag)
  • 完成后处理结果(tagFetched:在我的示例中)
  • 关于multithreading - 在后台做一些工作并返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6031961/

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