2015-03-07 23 views
7

chiamandoNSAttributedString initWithData e NSHTMLTextDocumentType incidente, se non sul thread principale

NSAttributedString * as = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil]; 

sul diverso thread principale, si traduce in un incidente

1 0x194b861fc <redacted> 
2 0x19801d31c <redacted> 
3 0x198010eb4 _os_once 
4 0x19801aa2c pthread_once 
5 0x195a0858c <redacted> 
6 0x195a07c78 WebKitInitialize 
7 0x18bb38918 <redacted> 
8 0x10020cdf0 _dispatch_client_callout 
9 0x10020dcfc dispatch_once_f 
10 0x1977f8bd0 <redacted> 
11 0x1978009ac <redacted> 
12 0x19780bdb8 <redacted> 
13 0x1940b259c _NSReadAttributedStringFromURLOrData 
14 0x1940b0eb4 <redacted> 
15 0x1001041a0 -[MPMPostTextBrickCell attributedTextWithHTMLString:] 
16 0x100103d3c __39-[MPMPostTextBrickCell setupWithBrick:]_block_invoke 
17 0x187fb3508 <redacted> 
18 0x187f04c94 <redacted> 
19 0x187ef461c <redacted> 
20 0x187fb626c <redacted> 
21 0x10020cdf0 _dispatch_client_callout 
22 0x100217854 _dispatch_queue_drain 
23 0x100210120 _dispatch_queue_invoke 
24 0x10021975c _dispatch_root_queue_drain 
25 0x10021af18 _dispatch_worker_thread3 
26 0x1980192e4 _pthread_wqthread 
27 0x198018fa8 start_wqthread 

quando non specificare l'attributo di muggito, di quanto non lo funziona

NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 

Ho bisogno di analizzare la stringa sul thread in background, ma questo rende impossibile :(

+0

Qual è il messaggio di errore? – Larme

+0

l'eccezione è EXC BAD ACCESS –

risposta

14

La documentazione è piuttosto esplicita al riguardo.

L'importatore HTML non deve essere chiamato da un thread in background (cioè, il dizionario include opzioni NSDocumentTypeDocumentAttribute con un valore di NSHTMLTextDocumentType). Proverà a sincronizzarsi con il thread principale, fallire e timeout. Chiamandolo dal thread principale funziona (ma può ancora scadere se l'HTML contiene riferimenti a risorse esterne, che dovrebbero essere evitati a tutti i costi). Il meccanismo di importazione HTML è pensato per implementare qualcosa come markdown (vale a dire stili di testo, colori e così via), non per l'importazione HTML generale.

L'utilizzo dell'importatore HTML (NSHTMLTextDocumentType) è possibile solo sul thread principale.

(Fonte: Apple's documentation)

+0

Il problema con questo è che si bloccherà l'interfaccia utente (specialmente se viene eseguita in un TableView o quando si preme un nuovo controller di visualizzazione). C'è un modo per analizzare l'HTML su un thread in background diverso da NSAttributedString? –

+0

Non senza usare librerie di terze parti che potrebbero farlo o programmare autonomamente un parser. A partire da ora non ci sono API per farlo su un thread in background fornito da Apple SDK afaik – AliSoftware

+0

Ho aggiunto 'DTCoreText' e sto usando il metodo' -initWithHTMLData' di NSAttributedString e sembra che stia funzionando molto meglio finora. –

1

Forse è troppo tardi per rispondere a questa domanda, ma può aiutare gli altri.

realtà NSAttributedString e NSHTMLTextDocumentType deve funzionare in modo asincrono sia in coda principale o una coda globale.

è possibile utilizzarlo in un thread in background, ma è necessario spedire il vostro blocco di codice contenente initializer NSAttributedString s' in una coda globale o principale. Ad esempio:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {() -> Void in 




      print("Started on \(NSThread.currentThread())") 

      let encodedData = "<font color=\"red\">Hello</font>".dataUsingEncoding(NSUTF8StringEncoding)! 
      let attributedOptions : [String: AnyObject] = [ 
       NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 
       NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding 
      ] 


      let attributedString = (try? NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil) ?? NSAttributedString(string: "")) 



      print("Finished") 

     } 
+0

Sarebbe bello se funzionasse come descritto, ma almeno sul simulatore Xcode iOS 9.2, e usando 'dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0)', la ricerca per indicizzazione continua mostra 'NSAttributedString' impostando il proprio semaforo e aspettando il thread principale per eseguire la conversione da HTML. –

+0

Hai provato in iOS 8.1? Arresto anomalo in coda globale. – Startry

+0

Puoi mostrarmi dove dice che questa funzione deve essere eseguita in modo asincrono? Mi piacerebbe fare qualche ulteriore lettura. – AnthonyM