CGFontCreateWithDataProvider在飞行模式下卡住了

11
当我在飞行模式下调用CGFontCreateWithDataProvider时,我的应用程序会冻结。而在非飞行模式下,它可以正常工作。该字体文件存储在设备上,不应该发生任何网络访问。
在调用此方法加载本地字体文件时:
[self registerIconFontWithURL:[[NSBundle mainBundle] URLForResource:@"FontAwesome" withExtension:@"otf"]];

以下方法中url的值为:file:///var/mobile/Applications/48D3DA14-235B-4450-A081-7A6BA6116667/Blah.app/FontAwesome.otf
+ (void)registerIconFontWithURL:(NSURL *)url
{
    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist");
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);

//******Freezes after the next line******
    CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
//******FROZEN******

    CGDataProviderRelease(fontDataProvider);
    CFErrorRef error;
    CTFontManagerRegisterGraphicsFont(newFont, &error);
    CGFontRelease(newFont);
}

iOS 7.1.x,iPhone 5。

我不知道为什么会发生这种情况,也找不到任何帮助。有人知道为什么会出现这种情况吗?

先感谢您的帮助!


发布相关代码。 - rmaddy
url 的值是什么? - rmaddy
@rmaddy,你看得太早了,现在已经有了 =) - DiscDev
为什么不使用CTFontManagerRegisterFontsForURL()呢? - pxpgraphics
1个回答

28

经过更多的搜索,我找到了答案。

根据以下错误报告:https://alpha.app.net/jaredsinclair/post/18555292

如果没有网络连接,CGFontCreateWithDataProvider()将会在信号量陷阱中挂起,如果它是在appDidFinishLaunchingWithOptions期间调用的。在下一个运行循环中调用它可以避免挂起。

如同相同的帖子中所述,在调用 CGFontCreateWithDataProvider() 之前调用

[UIFont familyNames]

可以解决此问题。我的代码现在看起来像这样,并且按预期工作:

+ (void)registerIconFontWithURL:(NSURL *)url
{
    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist");
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);

    //THE NEXT LINE IS RELEVANT PART
    [UIFont familyNames];

    CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
    CGDataProviderRelease(fontDataProvider);
    CFErrorRef error;
    CTFontManagerRegisterGraphicsFont(newFont, &error);
    CGFontRelease(newFont);
}

2
调用[UIFont familyNames];解决了我的问题!哇!你是怎么发现的 :o - Hlung
1
@Hlung 我在谷歌上搜索并找到了我回答中提到的错误报告...救了我 =) - DiscDev
2
哇,太棒了。你是怎么发现这个的? - Manuel M.
1
@ManuelM. 有些幸运/疯狂的谷歌搜索 =) - DiscDev
1
这也解决了我的问题,尽管我没有在飞行模式下调用它(即,我有一个有效的网络连接)。我试图从UIFont的扩展中调用它,在类initialize()方法的覆盖内部(这是Swift代码)。 - MusiGenesis
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接