首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSScanner和GCD时性能较低

使用NSScanner和GCD时性能较低
EN

Stack Overflow用户
提问于 2013-02-02 00:59:30
回答 1查看 318关注 0票数 0

我已经创建了一个方法来解析.m3u8文件,下载引用的文件,并重新创建一个新的.m3u8文件,以便在本地提供脱机播放。一切都能正常工作,但也许我误用了NSScaner或中央调度中心,因为在我看来,这个方法应该运行得很快,并在GCD中排队下载。然而,该方法需要运行全部时间(在后台,是的,但我希望尽快创建新文件,而不是在下载完所有文件之后)。有人能看到我的瓶颈在哪里吗?提前谢谢。

代码语言:javascript
复制
- (void)beginDownloadAndCreateLocalM3U8FileForLocalPlaybackFromPlaylist:(NSString*)playlist forId:(NSString*)_id withProgressBlock:(void (^)(float))progress withCompletionBlock:(void (^)(id))success
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        @autoreleasepool {
            NSString *stringURL = playlist;
            NSURL  *url = [NSURL URLWithString:stringURL];
            NSError *error;
            NSString *stringData = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
            NSString *foundData;
            NSScanner *scanner=[NSScanner scannerWithString:stringData];
            NSUInteger counter = 0;
            NSMutableString *m3u8 = [NSMutableString new];
            [scanner scanUpToString:@"#EXTINF" intoString:&foundData];
            [m3u8 appendString:foundData];
            NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString  *documentsDirectory = [paths objectAtIndex:0];
            if (![self directoryExistsAtAbsolutePath:[NSString stringWithFormat:@"%@/Web", documentsDirectory]]) {
                [[NSFileManager defaultManager] createDirectoryAtPath: [NSString stringWithFormat:@"%@/Web", documentsDirectory] withIntermediateDirectories: YES attributes:nil error: &error];
            }
            if (![self directoryExistsAtAbsolutePath:[NSString stringWithFormat:@"%@/Web/%@", documentsDirectory, _id]]) {
                [[NSFileManager defaultManager] createDirectoryAtPath: [NSString stringWithFormat:@"%@/Web/%@", documentsDirectory, _id] withIntermediateDirectories: YES attributes:nil error: &error];
            } else {
                success([NSString stringWithFormat:@"http://127.0.0.1:12345/%@.m3u8", _id]);
                return;
            }
            while (![scanner isAtEnd]) {
                [scanner scanUpToString:@"\n" intoString: &foundData];
                if ([foundData hasPrefix:@"#EXTINF:"]) {
                    [m3u8 appendFormat:@"%@\n", foundData];
                } else if ([foundData hasPrefix:@"http:"]) {
                    NSData *urlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:foundData]];
                    if ( urlData )
                    {
                        NSString  *filePath = [NSString stringWithFormat:@"%@/Web/%@/%i.ts", documentsDirectory, _id, counter];
                        NSString *localURL = [NSString stringWithFormat:@"http://127.0.0.1:12345/%@/%i.ts", _id, counter];
                        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
                            @autoreleasepool {
                                [urlData writeToFile:filePath atomically:YES];
                            }
                        });
                        //assemble the m3u8 file here for each entry with the original durations.  No need to recalculate.
                        //NSLog(@"Adding this: %@", filePath);
                        [m3u8 appendFormat:@"%@\n", localURL];
                        counter++;
                    }
                }
            }
            [m3u8 appendString:@"#EXT-X-ENDLIST"];
            [m3u8 writeToFile:[NSString stringWithFormat:@"%@/Web/%@.m3u8", documentsDirectory, _id] atomically:YES encoding:NSUTF8StringEncoding error:&error];
            NSLog(@"Final m3u8 is %@", m3u8);
            success([NSString stringWithFormat:@"http://127.0.0.1:12345/%@.m3u8", _id]);
        }
    });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-02 01:12:46

这行在这里

代码语言:javascript
复制
NSData *urlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:foundData]];

..。在与扫描仪同步运行的while循环中,扫描仪无法进入下一个令牌,直到它下载的URL已经下载完毕。尝试使用低优先级的dispatch_async()来涵盖else用例的所有逻辑,而不仅仅是writeToFile:调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14651322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档