[CocoaHeads Tricity] Michał Tuszyński - Modern iOS Apps

Preview:

Citation preview

Modern iOS app Architecture

Michał TuszyńskiiOS Developer, Schibsted Tech Polska

Agenda

1. Real time apps2. Modern asynchronous Core Data3. Embedded frameworks

What’s wrong?

What’s wrong?

func startPolling() { let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "update:", userInfo: nil, repeats: true) NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode) } @objc func update(timer: NSTimer) { let request = NSURLRequest(URL: NSURL(string: "https://myawsomeapp.com/get_something")!) let task = session.dataTaskWithRequest(request, completionHandler: handler) task.resume() }

What’s wrong?

Continuous polling is (usually) bad.

What’s wrong?

Alternative?

What’s wrong?

Silent Notifications!

{ "aps": { "content-available": 1, "sound": "" }, "object": { "value": "test" } }

Silent Notifications!

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void)

Silent Notifications!

Background fetch

Silent Notifications!

Background fetch

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)

Realtime app demohttp://pushtest.srgtuszy.com

What’s wrong?

let context = NSManagedObjectContext() context.persistentStoreCoordinator = persistentStore

What’s wrong?

Thread confinement is obsolete and left for backwards compatibility

What’s wrong?

Parent-child contexts are the way to go

Asynchronous Core Data?

Asynchronous Core Data?

- Separate context for writing to persistent store- NSAsynchronousFetchRequest- NSBatchUpdateFetchRequest

Embedded Frameworks

Frameworks vs static libraries

Choosing the right option

Use dlopen() on iOS 7

if (SystemVersionGreaterOrEqual(@"8.0")) { NSString *frameworkPath = [[NSBundle mainBundle] pathForResource:@"HockeySDK" ofType:@"framework"]; NSString *libraryPath = [frameworkPath stringByAppendingPathComponent:@"HockeySDK"]; void *handle = dlopen([libraryPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_LAZY); if (handle == NULL) { NSString *error = [NSString stringWithUTF8String:dlerror()]; NSLog(@"dlopen failed: %@", error); return; } id hockeyManager = [[NSClassFromString(@"BITAuthenticator") alloc] init]; dlclose(handle); }

Wrap up

Thank you!