• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop?


  • Subject: Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop?
  • From: Andy Lee <email@hidden>
  • Date: Wed, 08 May 2013 21:25:53 -0400

On May 8, 2013, at 3:14 PM, Jens Alfke <email@hidden> wrote:
> On May 7, 2013, at 3:52 PM, Ken Thomases <email@hidden> wrote:
>
>> Yes, it can.  Under the hood, NSAttributedString is using WebKit for HTML rendering.  In part that means that, when invoked from a background thread, it has to shunt the work to the main thread.  But it also means the main thread may have to run the run loop during the call.  It's a nuisance, but it's necessary since HTML can have references to external resources that need to be loaded.
>
> I’ve had trouble with this method in the past, for exactly that reason — you can get weird reentrancy problems from runloop sources like timers being invoked while in the middle of the call. (It’s also pretty slow.)
>
> IMHO it’s best to avoid this method if you can. For example, the last time this came up all I needed was the plain text, so I wrote a little string transformer to strip out HTML tags and expand HTML entities. For more involved work you could use NSXMLParser (with the “tidy” option) to parse the HTML into a DOM and then walk through that.

Yup. I had edge-case crashes too (fortunately reproducible one I knew the right edge case), and spent hours tracking it down to reentrancy problems in initWithHTML. Fortunately I could count on getting well-formed XML, and like Jens all I needed was to extract plain text, so I changed my solution to use NSXMLDocument and the crash went away.

Here's the link to the NSAttributedString class reference. I just now went to the bottom of the page and submitted feedback requesting that the docs warn about this pitfall. Perhaps others could do the same, on the chance that it will help some future programmer track down the problem a little sooner.

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSAttributedString_AppKitAdditions/Reference/Reference.html

I referenced this email thread in my comments:

http://lists.apple.com/archives/cocoa-dev/2013/May/msg00117.html

--Andy


_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


  • Follow-Ups:
    • Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop?
      • From: Jens Alfke <email@hidden>
References: 
 >Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop? (From: Jean Suisse <email@hidden>)
 >Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop? (From: Ken Thomases <email@hidden>)
 >Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop? (From: Jens Alfke <email@hidden>)

  • Prev by Date: Re: Wanted: new owner for Mac apps
  • Next by Date: Re: Showing numpad key equivs in menu items
  • Previous by thread: Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop?
  • Next by thread: Re: Does initWithHTML:dataUsingEncoding:documentAttributes: run an event loop?
  • Index(es):
    • Date
    • Thread