To keep your NSSet you can store it as an array. There are conversion methods like -[NSSet array] and +[NSSet setWithContentsOfArray:].
Also, you can try to determine if your code is running on SSD. SSD can be iterated in parallel and GCD will help a little when parallelizing the search. Sent from my iPad > On Apr 15, 2014, at 12:10 PM, Varun Chandramohan > <varun.chandramo...@wontok.com> wrote: > > Thanks Guys, > > Yes I was not planning to use -[NSURL isEqual:]. Interestingly, Graham¹s > suggestion was to use NSSet, I was thinking what if I want to keep this > persistent? I would be writing this set to a file? I have used NSArray > writeToFile before but I don¹t see that method for NSSet. Do I have to > convert it to NSArray and store? Am I missing something? > > I figured if I put resource identifier object into the NSMutableSet then > will I be able to write this into a file? I know it is possible if I store > it as NSString but might not allow id? > > Regards, > Varun > >> On 15/04/2014 12:01 pm, "Ken Thomases" <k...@codeweavers.com> wrote: >> >>> On Apr 14, 2014, at 7:02 PM, Varun Chandramohan wrote: >>> >>> I have a question about efficiency when trying to compare NSURL. The >>> requirement is quite simple. I try and iterate through a directory to >>> all subdirectories and files. While doing this walk-through, I need to >>> check against an array of NSURLs which are restricted files and folders. >>> This means if I find a match of file I am trying to access in the array >>> then I don't do any operations on that file and continue. >> >> You don't say how you're comparing URLs. Just in case, you should not >> use -[NSURL isEqual:] or any method which relies on string comparison. >> That can be confused by case differences, the presence of hard or >> symbolic links, and extraneous path elements (e.g. "foo/./bar" vs. >> "foo/bar"). >> >> You should obtain the resource identifier object of each URL using >> -getResourceValue:forKey:error: with NSURLFileResourceIdentifierKey, then >> compare those two objects using -isEqual:. >> >> If you take Graham's suggestion of using an NSSet or similar hash-based >> collection to test, then put the resource identifiers of the restricted >> files into the set and check a candidate URL's resource identifier >> against that set. >> >> For what it's worth, comparing resource identifiers may be faster than >> the string comparison otherwise inherent in -[NSURL isEqual:]. The >> identifier is likely to be a number or pair of numbers internally and so >> is quick to compare. That said, the improvement may be swamped by the >> cost of obtaining the resource identifier object. >> >> >>> Secondly, I plan to store array of NSURL for restricted files and >>> folders. What is the best way to get partial compare? >>> >>> Eg: Entry in array : /XYZ/abc >>> This means I should not iterate into the abc folder. So any files >>> /XYZ/abc/1.c or /XYZ/abc/def/2.c should all be skipped. Whats the best >>> way to do partial NSURL compare? Or is it better I store it as NSString >>> instead of NSURL? >> >> Don't try to do substring compares. Since you're iterating a directory >> hierarchy, you should simply not iterate a subdirectory if it matches. >> When using NSDirectoryEnumerator, that's easy to do: just call >> -skipDescendants. >> >> If you feel you must compare two URLs to see if one is contained in the >> other, you'll probably have to successively obtain the parent directory >> URL from the candidate URL using -getResourceValue:forKey:error: with >> NSURLParentDirectoryURLKey until you've reached the top of the hierarchy >> or you have matched one of your restricted file URLs. >> >> You _might_ want to optimize that by obtaining the >> NSURLVolumeIdentifierKey of each URL and then determining that one >> doesn't contain the other if the two URLs are for different volumes. >> Whether that's appropriate or not depends on whether you care about >> path-based containment or file-system-based containment. "/foo/bar/baz" >> may be on a different volume than "/foo" and you have to decide whether >> that means that it's not contained by "/foo". >> >> Regards, >> Ken > > > _______________________________________________ > > 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/xcvista%40me.com > > This email sent to xcvi...@me.com _______________________________________________ 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