Search code examples
iosswiftapple-watchwatchos-2watchconnectivity

Synchronising data from Apple Watch to iPhone with Swift


i am writing an Application for iOS and apple watch and need to synchronize data between apple watch and iPhone.

I did this for sending dat from iPhone to apple watch mentioned like here: http://telliott.io/2015/08/11/how-to-communicate-between-ios-and-watchos2.html

The other way, if i change data on my watch app and send the updated data to my iPhone there is a weird warning if the ViewController, where the message is received, is opened. When it is closed and i send the updated data from my watch there is no warning on my console and the data gets updated if i open the ViewController:

2015-11-16 11:28:19.057 GeoSocialRecommender[286:11448] This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes.  This will cause an exception in a future release.
 Stack:(
0   CoreFoundation                      0x0000000182410f60 <redacted> + 148
1   libobjc.A.dylib                     0x0000000196fc3f80 objc_exception_throw + 56
2   CoreFoundation                      0x0000000182410e90 <redacted> + 0
3   Foundation                          0x000000018342f2d8 <redacted> + 88
4   Foundation                          0x00000001832b5a1c <redacted> + 56
5   Foundation                          0x00000001832b15dc <redacted> + 260
6   UIKit                               0x0000000187aab8c4 <redacted> + 64
7   UIKit                               0x0000000187aac3dc <redacted> + 244
8   UIKit                               0x000000018820b1e4 <redacted> + 268
9   UIKit                               0x0000000187cb0f10 <redacted> + 176
10  UIKit                               0x000000018799f7ac <redacted> + 644
11  QuartzCore                          0x000000018719eb58 <redacted> + 148
12  QuartzCore                          0x0000000187199764 <redacted> + 292
13  QuartzCore                          0x0000000187199624 <redacted> + 32
14  QuartzCore                          0x0000000187198cc0 <redacted> + 252
15  QuartzCore                          0x0000000187198a08 <redacted> + 512
16  QuartzCore                          0x00000001871c7b0c <redacted> + 236
17  libsystem_pthread.dylib             0x00000001979f61e0 <redacted> + 584
18  libsystem_pthread.dylib             0x00000001979f5d58 <redacted> + 136
19  libsystem_pthread.dylib             0x00000001979f553c pthread_mutex_lock + 0
20  libsystem_pthread.dylib             0x00000001979f5020 start_wqthread + 4
)

Anyone can help me with this weird warning?

This is the method where i get the message

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){
    if(WCSession.isSupported()){
        self.prefs = Utils().importDataFromSession(prefs, applicationContext: applicationContext)
        initializeGUI(true)

    }
}

Solution

  • The WCSession header says:

    /** ----------------------------- WCSessionDelegate -----------------------------
     *  The session calls the delegate methods when content is received and session
     *  state changes. All delegate methods will be called on the same queue. The
     *  delegate queue is a non-main serial queue. It is the client's responsibility
     *  to dispatch to another queue if neccessary.
     */
    

    So if you want to update the UI you need to make sure that code runs on the application's main thread; so make the following change to your code and the warning will go away:

    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){
        if (WCSession.isSupported()) {
            self.prefs = Utils().importDataFromSession(prefs, applicationContext: applicationContext)
            dispatch_async(dispatch_get_main_queue(), {
                initializeGUI(true)
           })
        }
    }