【发布时间】:2016-03-08 16:53:35
【问题描述】:
我有一个模型对象,它有一个类方法来检查模型对象是否已经存在,如果存在则返回它,或者如果不存在则创建它然后返回它。此类使用 VLC 框架来生成有关视频文件的数据并生成缩略图。这就是我遇到麻烦的地方。
一旦调用了fetchthumbnail 方法,VLCThumbnailer 就会通过委托方法返回缩略图。问题是,在我的类创建方法到达它的返回函数之后,委托方法才会返回。这是一个代码示例。
-(AnimuProfile*)createnewProfileforFilename:(NSString*)filename{
NSURL *fileURL = [NSURL fileURLWithPath:filename];
VLCMedia *media = [VLCMedia mediaWithURL:fileURL];
FilenameParser *parser = [[FilenameParser alloc]init];
NSArray *parsedFilename = [parser parseFilename:[filename lastPathComponent]];
NSArray *mediaArray = [media tracksInformation];
if (mediaArray.count != 0) {
NSDictionary *videoTrackinfo = [mediaArray objectAtIndex:0];
_fansubGroup = parsedFilename[0];
_seriesTitle = parsedFilename[1];
_episodeNumber = parsedFilename[2];
_filename = [filename lastPathComponent];
_filepathURL = fileURL;
_filepathString = filename;
_watched = NO;
_progress = [VLCTime timeWithInt:0];
_length = [[media length]stringValue];
NSNumber *resolution = [videoTrackinfo valueForKey:@"height"];
_resolution = [NSString stringWithFormat:@"%@p",resolution];
VLCMediaThumbnailer *thumbnailer = [VLCMediaThumbnailer thumbnailerWithMedia:media andDelegate:self];
[thumbnailer fetchThumbnail];
NSString *libPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *profileName = [[_filename lastPathComponent] stringByAppendingPathExtension:@"prf"];
NSString *pathandProfileName = [libPath stringByAppendingPathComponent:profileName];
[NSKeyedArchiver archiveRootObject:self toFile:pathandProfileName];
return self;
}
然后是委托方法:
#pragma mark VLC Thumbnailer delegate methods
- (void)mediaThumbnailerDidTimeOut:(VLCMediaThumbnailer *)mediaThumbnailerP{
NSLog(@"Thumbnailer timed out on file %@",_filename);
UIImage *filmstrip = [UIImage imageNamed:@"filmstrip"];
_thumbnail = UIImagePNGRepresentation(filmstrip);
}
- (void)mediaThumbnailer:(VLCMediaThumbnailer *)mediaThumbnailer didFinishThumbnail:(CGImageRef)thumbnail{
UIImage *image = [UIImage imageWithCGImage:thumbnail];
_thumbnail = UIImagePNGRepresentation(image);
}
我知道锁定主线程等待调用委托方法是不可行的,那么在这种情况下应该怎么做?
【问题讨论】:
-
听起来您希望 completion block 成为 passed into your method。
标签: ios objective-c multithreading delegates vlc