Strategy for avoiding duplicate object ids for data shared across devices using iCloud
        Posted  
        
            by 
                rmaddy
            
        on Programmers
        
        See other posts from Programmers
        
            or by rmaddy
        
        
        
        Published on 2012-12-03T19:39:58Z
        Indexed on 
            2012/12/04
            5:22 UTC
        
        
        Read the original article
        Hit count: 305
        
ios
|objective-c
I have a data intensive iOS app that is not using CoreData nor does it support iCloud synching (yet). All of my objects are created with unique keys. I use a simple long long initialized with the current time. Then as I need a new key I increment the value by 1. This has all worked well for a few years with the app running isolated on a single device.
Now I want to add support for automatic data sync across devices using iCloud. As my app is written, there is the possibility that two objects created on two different devices could end up with the same key. I need to avoid this possibility.
I'm looking for ideas for solving this issue. I have a few requirements that the solution must meet:
1) The key needs to remain a single integral data type. Converting all existing keys to a compound key or to a string or other type would affect the entire code base and likely result in more bugs than it's worth.
2) The solution can't depend on an Internet connection. A user must be able to run the app and add data even with no Internet connection. The data should still resolve properly later when the data syncs through iCloud once a connection is available. I'll accept one exception to this rule. If no other option is available, I may be open to requiring an Internet connection the first time the app's data is initialized.
One idea I have been toying around with in my head is logically splitting the integer key into two parts. The high 4 or 5 bits could be used as some sort of device id while the rest represents the actual key. The fuzzy part is figuring out how to come up with non-conflicting device ids that fit in a few bits. This should be viable since I don't need to deal will millions of devices. I just need to deal with the few devices that would be shared by a given iCloud account.
I'm open to suggestions. Thanks.
© Programmers or respective owner