Ha, great link! It was fun reading about the possible pitfalls here. Database 
corruption simply by reading improperly? Yikes!

Also, the post served to bring dispatch_get_current_queue() to my attention, 
which seems quite handy.

This fella does not mention how he handles the whole “the [authorization 
request] completion handler is called on an arbitrary queue” issue, but 
probably the ‘solution’ there is for me to make a strategic retreat and prompt 
for access slightly before, instead of exactly at the moment that, I need 
access to the AB. 

Thanks for all the help, Quincey and Roland. I may still try this with a 
private thread and a runloop, just for fun. :)

Peter

> On Apr 25, 2015, at 10:27 PM, Roland King <r...@rols.org> wrote:
> 
> I had trouble believing there was an API left which was really thread-tied - 
> until I convinced myself that this one really is. I wonder why, underlying 
> SQL implementation perhaps? 
> 
> In the course of hunting around I found a blog entry here 
> http://adrian.schoenig.me/blog/2012/05/05/ios-addressbook-framework-and-gcd/ 
> <http://adrian.schoenig.me/blog/2012/05/05/ios-addressbook-framework-and-gcd/>.
>  It ended with this update which is interesting if not authoritative
> 
> "After having had a chat with Apple engineers, the recommended way is the 
> following: Create address book references on the fly whenever you need them. 
> Do not bother keeping them around since they are lightweight and fast to 
> create. The performance issue that I experienced was due to doing the initial 
> search and the cache for the address book not yet being warmed up. You could 
> just create a fake query at first to warm it up, but it is not recommended.”
> 
> if you don’t need to keep a long-running persistent reference to the address 
> book, you may well be able to create them when you need them, use them 
> immediately and then throw them away again. You may be able to create lots of 
> them in different blocks on possibly different background queues at the same 
> time and effectively parallelise the whole thing. 
> 
> You could, again if you don’t just need one true ABAddressBookRef, squirrel 
> created ones away in thread local storage, then they’re guaranteed to be 
> per-thread, but I’d only even try that rather dubious solution if analysis 
> showed that creating and destroying them was causing performance issues. 
> 
>> On 26 Apr 2015, at 09:51, Peter Tomaselli <peter.tomase...@icloud.com 
>> <mailto:peter.tomase...@icloud.com>> wrote:
>> 
>> Thanks for the reply. Well, now you’ve got me doubting myself. This is for 
>> iOS. Isn’t the C API the only option on that platform? 
>> 
>> I am planning on doing some work with the address book that doesn’t seem to 
>> be directly supported in the API (basically, I want to display all the email 
>> addresses in the address book that meet certain criteria). For this, I was 
>> assuming I’d have to grab pretty much all the email addresses from the book 
>> and iterate through them, bucketing as I go. 
>> 
>> This is all in my head so far, but if my ABAddressBookRef must live on the 
>> main thread forevermore, doesn’t that mean my “filtering” code must also run 
>> on the main thread? This is the reason I am concerned about blocking. 
>> 
>> Instead, my hope was to build a small wrapper class for the ’book that would 
>> accept blocks, run them off away from the main thread, and call back to the 
>> UI when done. 
>> 
>> It sounds like that’s maybe what is available on OS X already? But this is 
>> an iPhone app. I’ll check out the threading stuff; sounds like that might be 
>> fun to try anyway.
>> 
>> Appreciate the help,
>> 
>> Peter
>> 
>>> On Apr 25, 2015, at 9:23 PM, Quincey Morris 
>>> <quinceymor...@rivergatesoftware.com 
>>> <mailto:quinceymor...@rivergatesoftware.com>> wrote:
>>> 
>>> On Apr 25, 2015, at 17:54 , Peter Tomaselli <peter.tomase...@icloud.com 
>>> <mailto:peter.tomase...@icloud.com> <mailto:peter.tomase...@icloud.com 
>>> <mailto:peter.tomase...@icloud.com>>> wrote:
>>>> 
>>>> I don’t have a real good reason for not using the main thread at the 
>>>> moment—it seems fine, performance-wise, for what I am doing.
>>> 
>>> The point of these restrictions on ABAddressBook is that it’s *already* an 
>>> asynchronous API. There’s no synchronous waiting that would block the main 
>>> thread, and the fact that the completion handler is called on an 
>>> “arbitrary” thread suggests that all the heavy lifting is already done on a 
>>> background thread, outside of your control. For that reason, I can’t think 
>>> of a reason why you’d ever want to start from a background thread.
>>> 
>>> Also, do you have a good reason for sticking with the C API? What about 
>>> using the Cocoa API? [ABAddressBook sharedAddressBook] doesn’t seem to have 
>>> the same-thread requirement, though [ABAddress addressBook] does.
>>> 
>>> (Note that in the current state of OS X or iOS, it’s a mistake to assume 
>>> that the C version of an API is more performant than the Obj-C version. 
>>> It’s almost always better just to use the one that’s easier to use, and 
>>> that’s almost always the Obj-C version.)
>>> 
>>>> But I was interested in hearing if there was a more performant approach I 
>>>> might be missing, if only to satisfy my curiosity. Most of the info on the 
>>>> web about this is tons of GCD contortions that, from what I can tell, are 
>>>> missing the point.
>>>> 
>>>> So with respect to spinning up a thread to “keep around”, just point me in 
>>>> the right direction here (this would be new stuff for me): is it NSThread 
>>>> I should look at?
>>> 
>>> https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html
>>>  
>>> <https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html>
>>>  
>>> <https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html
>>>  
>>> <https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html>>
>>> 
>>> However, there’s no reason to believe that using a background thread is 
>>> going to perform better. All you’d be moving to the background thread, I 
>>> think, is the creation of the ABAddressBookRef data structure itself, which 
>>> isn’t going to make any difference to anything.
>>> 
>> 
>> _______________________________________________
>> 
>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com 
>> <mailto: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 
>> <http://lists.apple.com/>
>> 
>> Help/Unsubscribe/Update your Subscription:
>> https://lists.apple.com/mailman/options/cocoa-dev/rols%40rols.org 
>> <https://lists.apple.com/mailman/options/cocoa-dev/rols%40rols.org>
>> 
>> This email sent to r...@rols.org
> 

_______________________________________________

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