2014-07-23 23 views
9

Khi tôi thực hiện cuộc gọi đến CGFontCreateWithDataProviderkhi ở chế độ trên máy bay, ứng dụng của tôi bị treo. Không ở chế độ trên máy bay, nó hoạt động tốt. Phông chữ được lưu trữ trên thiết bị, không cần truy cập mạng.CGFontCreateWithDataProvider treo trong chế độ trên máy bay

Trong khi gọi phương pháp này để tải một tập tin phông chữ địa phương:

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

Giá trị của url bằng phương pháp sau là: 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.

Tôi không biết tại sao điều này có thể xảy ra và không thể tìm thấy bất kỳ trợ giúp nào ở đó. Có ai có một đầu mối tại sao điều này có thể xảy ra?

Cảm ơn trước!

+0

Đăng mã có liên quan. – rmaddy

+0

Giá trị của 'url' là gì? – rmaddy

+0

@rmaddy bạn đã xem quá sớm, hiện tại có =) – DiscDev

Trả lời

24

Tôi đã tìm thấy câu trả lời sau khi tìm kiếm thêm một chút.

Theo báo cáo lỗi sau: https://alpha.app.net/jaredsinclair/post/18555292

Nếu không có kết nối mạng, CGFontCreateWithDataProvider() treo trong một cái bẫy semaphore nếu nó được gọi trong appDidFinishLaunchingWithOptions. Gọi nó trong vòng lặp chạy tiếp theo hoạt động mà không cần treo.

Như đã đề cập trong một bài, gọi

[UIFont familyNames]

trước CGFontCreateWithDataProvider()

giải quyết vấn đề này. Mã của tôi bây giờ trông giống như thế này và hoạt động như mong đợi:

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

Câu trả lời rất hữu ích - cảm ơn! – mattsven

+2

gọi '[UIFont familyNames];' đã khắc phục sự cố của tôi! wow! làm thế nào bạn tìm ra điều này: o – Hlung

+0

@Hung Tôi googled xung quanh và tìm thấy các báo cáo lỗi được đề cập trong câu trả lời của tôi ... cứu tôi =) – DiscDev

Các vấn đề liên quan