The*_*ebe 8 multithreading background return-value objective-c-blocks
我正在尝试使用库从标签中获取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];
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
我希望能够返回该值,以便我可以调用:
NSString * myTag = [self readTag];
Run Code Online (Sandbox Code Playgroud)
那可能吗 ?谢谢你的帮助,迈克尔
小智 12
但是,从该函数返回一个字符串的问题是它可能需要在后台执行工作时保持调用线程 - 从而失去后台线程的好处.(dispatch_sync就是你要用来做的 - 不过我不推荐它).
使用块时,最好重新构建程序以更好地适应异步范例.当工作完成后,它应该通过向结果发送消息来通知正在等待结果的任何内容.在您的示例中,您将把它放在您在主队列上分派的代码块中.
@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
Run Code Online (Sandbox Code Playgroud)
那么你的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];
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
主要思想是您需要将处理分为两个阶段