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!
Recommended