Background Execution: Finite-Length Tasks
Mỗi lần apple cung cấp phiên bản hệ điều hành mới của iOS, các kỹ sư của họ mở rộng hơn kho public API vốn bị hạn chế. Trong đó không thể bỏ qua Background Excution - được công bố từ phiên bản iOS 4. Với sự mở rộng này đã giúp cho developer có sự thay đổi lớn về mặt thiết kế kiến trúc phần mềm ...
Mỗi lần apple cung cấp phiên bản hệ điều hành mới của iOS, các kỹ sư của họ mở rộng hơn kho public API vốn bị hạn chế. Trong đó không thể bỏ qua Background Excution - được công bố từ phiên bản iOS 4. Với sự mở rộng này đã giúp cho developer có sự thay đổi lớn về mặt thiết kế kiến trúc phần mềm cho nên tảng này. Hiện nay chúng ta có thể thiết kế những ứng dụng vẫn có thể hoạt động cho dù user đã thoát app - ấn vào nút Home. Thậm chí khi đó mọi hoạt động của ứng dụng được tạm dùng và sẽ khởi động lại khi user mở lại ứng dụng.
Tất nhiên Apple cũng đưa ra những hạn chế nhất định, nhằm giới hạn thời gian cho phép 1 tiến trình và số lượng tiến trình được thực thi ở chế độ background. Những hạn chế này nhằm giảm thiểu việc tiêu hao pin và cải thiện trải nghiệm người dùng. Ứng dụng của bạn chỉ được phép ctieesp tục chạy ở chế độ background trong trường hợp rất cụ thể như: play sound, update location, hoặc thực hiện download/upload.
Các phiên bản hệ điều hành trước iOS 7, ứng dụng đã được đưa ra lên đến 10 phút liên tục để hoàn thành bất cứ điều gì họ đã làm trước khi thực sự bị huỷ bởi hệ điều hành. Nhưng kể từ iOS 7 trở đi, thời hạn đưa ra cho ứng dụng hoat động ở chế độ background chỉ khoảng từ 180 giây tới 5 giây. Điều này hoàn toàn do hệ điều hành quyết định. Và ngay cả việc sử dụng NSURLSession để thực hiện download cũng gặp phải hạn chế như trên.
Trong bài viết này chúng ta sẽ tìm hiểu Finite-Length Task - một trong những hoạt động đươc phép chạy ở chế độ background.
FInite-Length Task
Về mặt kỹ thuật, đây không phải là một chế độ nền ở tất cả, là bạn không cần phải khai báo rằng ứng dụng của bạn sử dụng chế độ này trong Info.plist (hoặc sử dụng chế độ nền hộp kiểm). Thay vào đó, nó là một API cho phép bạn chạy mã nhị phân cho một số lượng hữu hạn của thời gian khi ứng dụng của bạn trong nền. Sao cũng được!
Trong quá khứ, chế độ này thường được sử dụng để hoàn thành một tải lên hay tải về và hào phóng (nhưng không được bảo đảm) 10 phút đã được cung cấp để thực hiện các nhiệm vụ này. Nhưng nếu kết nối là chậm và quá trình này vẫn chưa hoàn thành? Nó sẽ để lại ứng dụng của bạn trong trạng thái kỳ lạ và bạn sẽ có thêm nhiều lỗi xử lý mã để làm cho mọi việc sanely. Bởi vì điều này, Apple đã giới thiệu NSURLSession.
Mặc dù không phải là một chủ đề của bài hướng dẫn này, NSURLSessionlà mạnh mẽ khi đối mặt với backgrounding và thậm chí thiết bị khởi động lại và thực hiện việc này một cách hiệu quả năng lượng. Nếu bạn đang đối phó với tải lớn, hãy kiểm tra của chúng tôi hướng dẫn NSURLSession .
Một trường hợp sử dụng vẫn còn rất giá trị của các Dù chế độ nền là để hoàn thành một số nhiệm vụ lâu dài chạy, chẳng hạn như hiển và viết một đoạn video vào thư viện ảnh.
Nhưng đây chỉ là một ví dụ. Theo mã bạn có thể chạy là tùy ý, bạn có thể sử dụng API này để làm khá nhiều bất cứ điều gì: thực hiện các phép tính dài (như trong hướng dẫn này), áp dụng các bộ lọc hình ảnh, vẽ một lưới 3D phức tạp ... bất cứ điều gì! Trí tưởng tượng của bạn là giới hạn, miễn là bạn hãy ghi nhớ rằng bạn chỉ nhận được một số thời gian, không giới hạn thời gian. Bao nhiêu thời gian bạn nhận được sau khi ứng dụng của bạn được background được xác định bởi iOS. Có gì đảm bảo về thời gian mặc định, nhưng bạn luôn có thể kiểm tra backgroundTimeRemainingtrên UIApplication. Điều này sẽ cho bạn biết bao nhiêu thời gian bạn đã để lại.
Các chung, sự đồng thuận quan sát dựa trên là bạn có được 3 phút. Một lần nữa, có gì đảm bảo và các tài liệu API thậm chí không cung cấp cho một số sân chơi bóng chày - do đó, không dựa vào số này. Bạn có thể nhận được 5 phút hoặc 5 giây, vì vậy ứng dụng của bạn cần phải được chuẩn bị sẵn sàng cho bất cứ điều gì!
Dưới đây là một nhiệm vụ phổ biến mà mọi sinh viên CS nên quen thuộc với: tính toán các số trong dãy số Fibonacci . The twist ở đây là bạn sẽ tính toán các con số trong nền !
Mở WhateverViewController.swift và thêm các tính chất sau đây để WhateverViewController:
var previous = NSDecimalNumber .one ( ) var current = NSDecimalNumber .one ( ) var position : UInt = 1 var updateTimer : NSTimer ? var backgroundTask : UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
Các NSDecimalNumberssẽ giữ hai giá trị trước đó của các số trong dãy. NSDecimalNumberCó thể giữ số lượng rất lớn, vì vậy nó rất thích hợp cho mục đích của bạn. positionChỉ là một bộ đếm cho bạn biết vị trí số hiện trong series.
Bạn sẽ sử dụng updateTimerđể chứng minh rằng ngay cả giờ tiếp tục làm việc khi sử dụng API này, và cũng để làm chậm quá trình tính toán một chút, do đó bạn có thể quan sát chúng.
Thêm một số phương pháp hữu ích để WhateverViewControllermà thiết lập lại các tính toán Fibonacci và khởi đầu đó và dừng lại một công việc nền-thể:
func resetCalculation() { previous = NSDecimalNumber.one() current = NSDecimalNumber.one() position = 1 } func registerBackgroundTask() { backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { [unowned self] in self.endBackgroundTask() } assert(backgroundTask != UIBackgroundTaskInvalid) } func endBackgroundTask() { NSLog("Background task ended.") UIApplication.sharedApplication().endBackgroundTask(backgroundTask) backgroundTask = UIBackgroundTaskInvalid }
Đây là phần quan trọng, điền vào thực hiện sản phẩm nào cho didTapPlayPause(_