On 20 Mar 2014, at 01:50, Charles Srstka <cocoa...@charlessoft.com> wrote:

> On Mar 19, 2014, at 7:29 PM, patrick machielse <patr...@hieper.nl> wrote:
> 
>> We are working on a sandboxed application that keeps track of a large number 
>> of files through security scoped URLs. To access the files we carfully 
>> balance our calls to startAccessingSecurityScopedResource / 
>> stopAccessingSecurityScopedResource:
>> 
>> [url startAccessingSecurityScopedResource]
>> /* do some work */
>> [url stopAccessingSecurityScopedResource]
>> 
>> 
>> All was fine until we needed to start accessing the files from multiple 
>> threads simultaneously. According to the documentation:
>> 
>> "When you call the stopAccessingSecurityScopedResource method, you 
>> immediately lose access to the resource in question (even if you have 
>> previously called startAccessingSecurityScopedResource more than once)."
>> 
>> Thus, as soon as 1 thread executes its 
>> 'stopAccessingSecurityScopedResource', all access in other threaded code 
>> blocks is lost.
>> 
>> It seems that we must design our own bookkeeping around security scoped 
>> urls, make sure we don't manage resource access directly in our frameworks, 
>> and hope no 3rd party frameworks call stopAccessingSecurityScopedResource 
>> behind our backs. We find this API design disappointing (to say the least), 
>> it's as if we need to call retain / release *and also* manage the retain 
>> count ourselves...
>> 
>> 
>> Sandboxing is a good idea in theory, but the implementation has been kicking 
>> sand (.) in our faces for a while now.
>> 
>> Did we miss some hidden feature? Did anyone design a re-usable solution for 
>> accessing security scoped resources from multiple threads?
>> 
>> We'd be grateful for any ideas!
>> 
>> patrick
> 
> Have you tried using CFURLStartAccessingSecurityScopedResource instead of 
> -startAccessingSecurityScopedResource? This is what the documentation has to 
> say about it:
> 
> "Calls to the CFURLStartAccessingSecurityScopedResource function (or its 
> Cocoa equivalent) are nestable on a per-process basis. This means that if 
> your app calls the start method on a URL twice, to fully relinquish access to 
> the referenced resource you must call the corresponding stop method twice."
> 
> Of course, it also claims that the Cocoa method does this, so who knows.

The Cocoa method behaves the same. And the implementation as I understand it is 
path-based (rather being tied to a specific NSURL instance). It’s basically 
reference counting for file system access permissions.


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to