CGFontCreateWithDataProvider在飞行模式下挂起

时间:2014-07-23 02:38:22

标签: ios objective-c fonts freeze

当我在飞机模式下呼叫CGFontCreateWithDataProvider 时,我的应用会冻结。不是飞机模式,它工作正常。字体存储在设备上,不应该进行网络访问。

调用此方法加载本地字体文件时:

[self registerIconFontWithURL:[[NSBundle mainBundle] URLForResource:@"FontAwesome" withExtension:@"otf"]];

以下方法中url的值为: 文件:///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。

我不知道为什么会发生这种情况,并且无法在那里找到任何帮助。有没有人知道为什么会发生这种情况?

提前致谢!

1 个答案:

答案 0 :(得分:25)

经过一番搜索,我找到了答案。

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

  

如果没有网络连接,CGFontCreateWithDataProvider()会挂起   在一个信号量陷阱如果它被调用期间   appDidFinishLaunchingWithOptions。在下一个运行循环中调用它   无悬挂地工作。

如同一篇文章所述,请致电

[UIFont familyNames]

之前CGFontCreateWithDataProvider()

解决了这个问题。我的代码现在看起来像这样并按预期工作:

+ (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);
}