2014-07-23 11 views
9

Quando si effettua una chiamata a CGFontCreateWithDataProviderin modalità aereo, le mie app si bloccano. Non in modalità aereo, funziona bene. Il carattere è memorizzato sul dispositivo, nessun accesso alla rete dovrebbe accadere.CGFontCreateWithDataProvider si blocca in modalità aereo

Durante la chiamata di questo metodo per caricare un file di font locale:

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

Il valore della url nel metodo seguente è: 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.

Non ho idea del perché questo potrebbe accadere e non sono stato in grado di trovare alcun aiuto là fuori. Qualcuno ha idea del perché questo potrebbe accadere?

Grazie in anticipo!

+0

Invia il codice pertinente. – rmaddy

+0

Qual è il valore di 'url'? – rmaddy

+0

@rmaddy hai guardato troppo presto, è lì ora =) – DiscDev

risposta

24

Ho trovato la risposta dopo un po 'più di ricerca.

secondo la seguente segnalazione: https://alpha.app.net/jaredsinclair/post/18555292

Se non c'è alcuna connessione di rete, CGFontCreateWithDataProvider() si blocca in una trappola del semaforo se si chiama durante appDidFinishLaunchingWithOptions. Chiamandolo nel ciclo di esecuzione successivo, funziona senza impiccagione.

Come osservato nello stesso posto, chiamando

[UIFont familyNames]

prima CGFontCreateWithDataProvider()

risolve il problema. Il mio codice ora appare come questo e funziona come previsto:

+ (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

Risposta molto utile - grazie! – mattsven

+2

chiamando '[UIFont familyNames];' risolto il problema! Wow! come hai capito: o – Hlung

+0

@Hlung Ho cercato su Google e ho trovato la segnalazione di bug menzionata nella mia risposta ... mi ha salvato =) – DiscDev