Privacy Policy

Privacy Policy

Van Tien Tu built the Chiti app as a Free app. This SERVICE is provided by Van Tien Tu at no cost and is intended for use as is.

This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.

If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.

The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Chiti unless otherwise defined in this Privacy Policy.

Information Collection and Use

For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way.

The app does use third party services that may collect information used to identify you.

Link to privacy policy of third party service providers used by the app

Log Data

I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.

Cookies

Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device’s internal memory.

This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.

Service Providers

I may employ third-party companies and individuals due to the following reasons:

  • To facilitate our Service;
  • To provide the Service on our behalf;
  • To perform Service-related services; or
  • To assist us in analyzing how our Service is used.

I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.

Security

I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security.

Children’s Privacy

These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions.

Changes to This Privacy Policy

I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page.

This policy is effective as of 2020-08-18

Contact Us

If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at vantientu1703@gmail.com.

Phone number: +84368947585

Address:

  • Số 213, Đường 20, Phường 5, Gò Vấp, Hồ Chí Minh (TP) 700000

#9 Cơ bản về RxSwif

Có một vài thuật ngữ cơ bản chúng ta cần hiểu rõ như sau:

Observer là gì?

Trước đây khi chúng ta muốn theo dõi dự liệu thay đổi thì thường dùng protocol/delegate hoặc closurse/block. Nhưng với RxSwift chúng ta sử dụng Observer để quan sát sự thay đổi của dữ liệu. Như vậy code sẽ ngắn gọn và tối ưu hơn.

Observable là gì?

Theo cá nhân tôi hiểu thì Observable là đối tượng bị theo dõi, khi có thay đổi sẽ emit ra events cho các subscribes. Ví dụ bạn dùng điện thoại, đồng hồ, bạn đặt báo thức khi điện thoại/đồng hồ kêu. Lúc này điện thoại/đồng hồ của bạn sẽ là Observable, còn bạn là Observer.

Các Subjects cần biết:

Trước khi giới thiệu các subjects thì tôi muốn bạn hiểu subject là gì? Subject là có thể Observale và Observer cùng một lúc. Về cơ bản tức là nó vừa bị quan sát và vừa có thể quan sát.

  • BehaviorSubject: khi bạn subscribe đến nó, bạn sẽ nhận được giá trị cuối cùng được phát ra bởi subject và tiếp tục là những giá trị phát ra sau khi bạn subscribe, bạn cũng sẽ nhận được
  • PublishSubject: khi bạn subscribe đến nó, bạn sẽ chỉ nhận được những giá trị mà nó phát ra sau khi bạn subscribe
  • ReplaySubject: khi bạn subscribe đến nó, bạn sẽ nhận được giá trị phát ra sau khi subscribe, đồng cả những giá trị mà đã được phát ra trước khi subscribe. Vậy thì bạn sẽ nhận được bao nhiêu gía trị cũ? Nó tuỳ thuộc vào buffer size của ReplaySubject mà bạn subscribe tới, bạn quyết định số lượng đó là bao nhiêu khi bạn init subject.

 

Trong bài này mình chỉ giới thiệu sơ qua về khái niệm. Những bài sau mình sẽ đi trực tiếp vào cách sử dụng và viết code. Cảm ơn bản đã đọc bài viết của mình.

#8 Content Compression Resistance Priority và Content Hugging Priority

Trong bài viết này mình chia sẻ chút về sử dụng Content hugging priority và Content compression resistance priority trong autolayout. Mục đích sử dụng 2 cách autolayout ở trên để chúng ta tận dụng tối đa không gian hiển thị của view một cách linh động.

Tôi đã tham khảo một vài bài viết tương từ về điều này nhưng cách giải thích của họ về điều này khiến tôi khá mơ hồ cho nên tôi viết bài này để trình bày quan điểm cá nhân cũng như cách nhìn nhận của bản thân. Tôi sẽ đi vào từng ví dụ cụ thể để các bạn hiểu rõ hơn.

Khi nào sử dụng Content compression resistance priority?

Layout thông thường

Trường hợp này tôi có 2 label cùng hàng red và blue bị giới hạn trong không gian chiều rộng nhất định. Yêu cầu của bài toán label red sẽ được ưu tiên hơn là label blue cho nên tôi layout cố định chiều rộng của label red như hình bên dưới.

Label red sẽ được ưu tiên rộng hơn để hiển thị nội dung, còn label blue ưu tiên thấp nên sẽ hiển thị 3 chấm ở đằng sau.

Screen Shot 2018-11-28 at 10.02.15 AM.png

Vì trong bài toán cụ thể thì text hiển thị sẽ phụ thuộc vào dữ liệu, vậy nếu trong trường hợp text của label red ngắn hơn thì sao?

Như hình ở bên dưới:

Screen Shot 2018-11-28 at 10.08.48 AM.png

Trong trường này, mặc dù text của label red ngắn hơn nhưng nó vẫn chiếm một khoảng khôn gian như vậy, suy ra sẽ bị lãng phí một khoảng không gian mà label blue vẫn phải hiển thị dạng có 3 chấm ở sau, về mặt thẩm mỹ thì sẽ không đẹp.

Sử dụng Content compression resistance priority

Vì vậy Content compression resistance priority sẽ giúp ta giải quyết vấn đề này. Việc làm của chúng ta rất đơn giản:

  • Bỏ autolayout chiều rộng của label red đi
  • Cài đặt thuộc tính Horizontal của label red lên 751 (mặc định là 750) trong mục Content compression resistance priority, label blue thì vẫn giữ nguyên. Việc làm này muốn nói rằng nội dung label red được ưu tiên hơn và hiển thị một cách linh động.

Sau khi thực hiện các bước trên thì layout của chúng ta sẽ như hình ảnh minh họa bên dưới:

Screen Shot 2018-11-28 at 10.20.40 AM.png

 

Khi nào nào sử dụng Content hugging priority?

Auto layout thông thường

Tương tự với Content compression resistance priority, lần này chúng ta sẽ autolayout cho 2 label red và blue nhưng là cùng cột bị giới không gian trong một chiều cao nhất định, như là hình bên dưới:

Screen Shot 2018-11-28 at 10.37.06 AM.png

Trong trường hợp này tôi vẫn ưu tiên label red hơn label blue do vậy text của label red thì được hiển thị đầy đủ còn label blue hiển thị 3 chấm đằng sau.

Nếu trong trường hợp text của label red mà ngắn đi thì xảy ra trường hợp tương tư như ở bên trên là không gian sẽ bị lãng phí mà label blue vẫn phải hiển thị 3 chấm đằng sau.

Do vậy chúng ta sử dụng Content hugging priority

Sử dụng Content hugging priority
  • Bỏ layout chiều cao của label red
  • Cài đặt thuộc tính Vertical của label red là 252 (mặc định là 251) ở mục Content hugging priority. Điều này thể hiện rằng chúng ta ưu tiên hiển thị cho label red và hiển thị một cách linh động.

Sau khi làm xong các bước trên ta thu được kết quả như hình dưới:

Screen Shot 2018-11-28 at 10.49.10 AM.png

Vẫn trong cùng một không gian nhưng chúng ta có thể hiển thị views linh động và đẹp hơn.

Cảm ơn bạn đã đọc bài viết.

 

 

 

#7 Sử dụng NotificationCenter như thế nào trong Swift 4?

Với một NotificationCenter bạn có thể phát sóng dữ liệu từ một phần của app đến những phần nơi khác của app. Nó sử dụng Observer pattern để thông báo cho những người đã đăng ký quan sát khi có thông báo đến, sử dụng một điều phối trung tâm gọi là Notification Center.

Trong bài viết này chúng ta sẽ tìm hiểu cơ chế làm việc của Notification Center như thế nào và cách bạn sử dụng nó trong ứng dụng của mình. Notification Center đặc biết hữu ích để nhận dữ liệu từ một phần của ứng dụng sang một phần khác của ứng dụng.

Trước khi bắt đầu, có một vài lưu ý như sau:

  • NotificationCenter thường được nhắc đến như NSNotificationCenter với tiền tố “NS” ở Swift 3. Bạn sẽ thấy mọi người gọi nó là NSNotificationCenter
  • Cơ chế của NotificationCenter không liên quan gì tới đến push notification hoặc Notification Center UI
  • Hướng dẫn này chủ yếu tập trung vào sử dụng NotificationCenter  để gửi chương trình phát sóng trong app bằng Swift 4.

NotificationCenter làm việc như thế nào?

Chúng ta bắt đầu với việc NotificationCenter làm việc chính xác như thế nào, nó gồm 3 phần.

  • Một “listener” để lắng nghe các thông báo được gọi là Observer
  • Một “sender” để gửi các thông báo khi có chuyện gì đó xảy ra
  • Trung tâm thông báo, theo dõi các nhà qua sát (Observers) và thông báo.

Cơ chế này rất đơn giản, hãy cùng xem xét sự việc tương tự:

  • Bạn đang làm việc ở một cơ sở xử lý thư để cung cấp thư cho 5 đường phố sắc màu.
  • Bạn – người đưa thư, cần cung cấp thư màu tím đến phố màu tím bất cứ khi nào nó đến cơ sở xử lý thư.
  • Khi sự dịch chuyển của bạn bắt đầu, bạn nói với trung tâm lệnh của cơ sở thư – hãy gọi cho Bob – bạn muốn biết khi nào thư màu tím sẽ tới.
  • Thời gian qua đi, Alice ở phố màu vàng muốn gửi một thư đến đường phố màu tím
  • Do vậy, cô ấy gửi bức thư của cô ấy đến cơ sở thư, và sẽ được Bob sẽ chọn bức thư ở trung tâm lệnh và thông báo cho bạn biết có thư màu tím đến
  • Bạn nhận thư màu tím và gửi an toàn đến đường phố màu tím.

Điều tuyệt vời của cơ chế này là Bob và Alice không cần phải biết nhau họ chỉ cần biết đến trung tâm lệnh là NotificationCenter

Vì thế, NotificationCenter có thế sử lý một-nhiều hoặc nhiều-nhiều giao tiếp.Alice có thế gửi đồ cho Bob, Arthur cũng có thế gửi đồ cho Bob, nếu Alice đang lắng nghe thì Bob và Arthur cũng có thế gửi đồ cho Alice.

Đây là tổng quan về cơ chế của NotificationCenter:

 

Đây là chuyện gì xảy ra:

  1. Phần B nói với NotificationCenter rằng nó muốn quan sát một thông báo với addObserver(_:selector:name:object:)
  2. Những thứ xảy ra trong phần A, như dữ liệu đến hoặc công việc hoàn thành
  3. Phần A sẽ tạo và đăng một thông báo lên NotificationCenter
  4. NotificationCenter sẽ thông báo cho phần B rằng một thông báo mà nó quan sát đã được đăng bằng cách gọi một selector ở phần B.
  5. Một selector sẽ được gọi, và thực thi hiệu quả chức năng ở phần B

Phần A và B có thể là bất cứ kiểu class nào, có thể là tùy chỉnh API class hoặc data model

Đăng ký quan sát thông báo như thế nào?

Đây là cách bạn đăng ký

NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveData(_:)), name: .didReceiveData, object: nil)

Điều này thêm một entry đến NotificationCenter, về cơ bản nó với nó rằng “self” muốn quan sát những thông báo với tên là “.didReceiveData”, khi có thông báo xảy ra thì function onDidReceiveData(_🙂 sẽ được gọi.

Function addObserver(_:selector:name:object:) có 4 đối số truyền vào:

  • Tham số đầu tiên thường không được đặt tên, bạn cung cấp nó tham chiếu đến đối tượng quan sát thông báo này thường là self
  • Tham số selector thứ 2 là function bạn muốn gọi khi có thông báo xảy ra, nó làm việc giống action-target pattern.
  • Tham số name thứ 3 là tên của thông báo mà bạn muốn lắng nghe, nó là kiếu Notification.Name
  • Tham số object thứ 4 là đối tượng không bắt buộc, người mà bạn muộn nhận những thông báo, nếu bạn cài đặt nó thì bạn chỉ có thế nhận được thông báo từ “sender” đó

Function bạn muốn gọi khi một thông báo được quán sát.

@objc func onDidReceiveData(_ notification:Notification) { // Do something now }

Function có một tham số, nó được gọi là Notification. Bạn sẽ thấy sau này bạn có thể sử dụng thuộc tính userInfo để gửi một số dữ liệu với thông báo

Mọi thông báo có một cái tên với kiểu Notification.Name. Bạn có thể tạo như sau:

let name = Notification.Name(“didReceiveData”)

Tiện lợi hơn nếu bạn thêm tên thông báo của mình vào static constant extension của Notification.Name:

extension Notification.Name {

static let didReceiveData = Notification.Name(“didReceiveData”)

static let didCompleteTask = Notification.Name(“didCompleteTask”)

static let completedLengthyDownload = Notification.Name(“completedLengthyDownload”)

}

Tên thông báo bây giờ đã sẵn sàng như static constant kiểu Notification.Name. Do vậy bạn có thế sử dụng cú pháp:

NotificationCenter.default.addObserver(self, selector: [selector], name: .didCompleteTask, object: nil)

Thông tường bạn có thể đăng ký và xóa các quan sát viên (observer) ở:

  • viewDidLoad() và dealloc, hoặc
  • viewWillAppear(_:) and viewWillDisappear(_:)

Bạn có thể xóa người qua sát với removeObserver(_:name:object:) và sử dụng chính xác các tham số như addObserver(…)

Đăng một thông báo như thế nào?

Bây giờ chúng ta quan sát một thông báo và cùng đăng nó.

NotificationCenter.default.postNotification(name: .didReceiveData, object: nil, userInfo: nil)

Trong function trên có 3 tham số:

  • Tham số đầu tiên là name, nó chính xác giống như tên thông báo mà bạn đang quan sát
  • Tham số thứ 2 là object, là sender của thông báo, bạn có thể truyền vào nil, mục đích của đối số này là giống với ở addObserver(…) , bạn có thể sử dụng nó để lọc các thông báo
  • Tham số thứ 3 là userInfo, mục đích của tham số này là truyền vào dữ liệu để những nơi bạn đang quan nhận được dữ liệu.

Sử dụng NotificationCenter cho những trường hơp nào?

  1. Khi giao tiếp giữa hai hoặc nhiều thành phần của ứng dụng của bạn, không có kết nối chính thức, cần phải xảy ra
  2. Khi giao tiếp xảy ra nhiều lần và nhất quán
  3. Khi giao tiếp sử dụng cho một-nhiều hoặc nhiều-nhiều

Nguồn bài viết

#6 39 Open source Swift UI cho sự phát triển ứng dụng iOS

Đang rảnh và không biết làm gì nên làm một bài review qua các thư viện được đánh giá cao trên Github cho mọi người xem.

Đây là một “amazing” series của open sources projects.

Được phát triển bởi Apple Inc, Swift là ngôn ngữ lập trình phổ biến hiện tại, và nó là một trong những cộng đồng năng động đóng góp open sources cho các dự án.

Open source libraries có thể rất “sweet” và chúng giúp cuộc sống của bạn dễ dàng hơn trong việc xây dựng ứng dụng iOS. Đối với những người dùng iOS chi hàng giờ và hàng ngày để săn tìm những thư viện tốt, bạn có thể thấy bài đăng này hữu ích.

Sau đây tôi xin giới thiệu cho bạn một số open source libraries hữu ích, có thể giúp bạn rất nhiều trong việc phát triển sản phẩm iOS.

Animation

No 1

Spring: là một thư viện về iOS animation đơn giản trong Swift. (9164 stars on Github)

No 2

Material: Một framework về animation và graphics sử dụng để tạo ra ứng dụng đẹp. (6120 stars on Github)

No 3

RazzleDazzle: Một framework về hoạt ảnh dựa trên khung hình chính trong Swift. Sử dụng cho việc làm màn hình giới thiệu của ứng dụng. (2291 stars on Github)

No 4

Stellar: Một thư viện hoạt ảnh vật lý tuyệt diệu cho Swift. (1881 stars on Github)

No 5

Macaw: Bản thân thấy không hề dễ sử dụng =)). (594 stars on Github)

Transition

No 6

PagingMenuController: Paging view controller với sự sẵn sàng tùy chỉnh menu trong Swift. (1305 stars on Github)

No 7

PreviewTransition: Một gallery controller xem trước đơn giản. (1025 stars on Github)

No 8

PrinterestSwift: Transition giống như Printerest trong Swift. (1007 stars on Github)

No 9

Youtube Transition: Xem một video bên góc phải  giống như ứng dụng Youtube trên iOS, được viết bằng Swift 3. (786 stars on Github)

No 10

Twicwet Segmented Control: Tùy chỉnh UISegmentedControl thay thế cho iOS. (680 stars on Github)

Pop up

No 11

SCLAlertView-Swift: Alert View với hoạt ảnh đẹp. (3056 stars on Github)

No 12

SwiftMessages: Alert message rất linh hoạt. (1356 stars on Github)

No 13

XLActionController: Sẵn sàng tùy chỉnh và mở rộng Action sheet controller trong Swift 3. (1346 stars on Github)

No 14

Popover: Thư viện hiển thị balloon pop up như ứng dụng Facebook. (852 stars on Github)

No 15

Presentr: Wrapper để tùy chỉnh viewcontroller presentations. (635 stars on Github)

Feed

No 16

FoldingCell: Mở rộng content của cell được lấy cảm hứng từ folding paper material. (4285 stars on Github)

No 17

ExpandingCollection: Thẻ peel/pop controller. (2425 stars on Github)

No 18

DGElasticPullToRefresh: Có hiệu ứng đàn hồi khi refresh component. (2308 stars on Github)

No 19

Persei: Hoạt cảnh top menu cho UITableView/ UICollectionView/ UIScrollView. (2269 stars on Github)

No 20

IGListKit: Một framework data-driven UICollectionView để build nhanh và linh hoạt. (2443 stars on Github)

No 21

PullToMakeSoup: tùy chỉnh hoạt cảnh pull-to-refresh có thế dễ dàng thêm vào UIScrollView . (1301 stars on Github)

Onboarding

No 22

DZNEmptyDataSet: Dùng để hiển thị view khi data trống. (6552 stars on Github)

No 23

Instructions: Tạo walkthroughts và hướng dẫn thứ tự các bước. (2256 stars on Github)

No 24

Presentation: Tạo hướng dẫn, relase note, hoạt ảnh pages. (1680 stars on Github)

Color

No 25

Chameleon: Framework về màu sắc phẳng. (7071 stars on Github)

No 26

Hue: Tiện ích tô màu tất cả trong một bạn cần phải viết trong Swift (1612 stars on Github)

No 27

DynamicColor: Phần mở rộng để thao tác các màu dễ dàng trong Swift.

Image

No 28

FaceAware: Một phần mở rộng cho UIImageView để tập trung vào khuôn mặt trong một bức ảnh khi sử dụng AspectFill (1424 stars on Github)

No 29

ComplimentaryGradientView: Tạo các gradient bổ sung để tạo ra từ các màu chủ đạo và nổi bật trong ảnh được cung cấp. (384 stars on Github)

Graph

No 30

Charts: Ở thư viện này có rất nhiều charts đẹp. (11433 stars on Github)

No 31

Scrollale-GraphView: Chế độ xem biểu đồ có thể cuộn thích hợp cho iOS để trực quan hóa các tập dữ liệu rời rạc đơn giản. (3065 stars trên Github)

Icon

No 32

Paper Switch: RAMPaperSwitch là một Swift module nó sơn màu lên parent view khi switch bật. (1849 stars on Github)

No 33

CircleMenu: Một menu đơn giản, thanh lịch với bố trí hình tròn. (1768 stars on Github)

Schedule

No 34

JTAppleCalendar: Thư viện có cung cấp sẵn một số thiết kế Calendar mọi người cùng tham khảo. (1026 stars on Github)

No 35

DateTimePicker: Một phần UI đẹp của iOS cho việc chọn ngày và giờ. (455 stars on Github)

Form

No 36

Eureka: Một số thiết kế form cho iOS. (4117 stars on Github)

Layout

No 37

Neon: Đây là một layout phổ biến cho iPhone và iPad. (3439 stars on Github)

Message

No 38

NMessenger: Một thành phần nhanh, nhẹ được xây dựng trên AsyncDisplaykit. (1492 stars on Github)

No 39

Reel-search: Một search controller cho phép bạn chọn tùy chọn từ một list. (1364 stars on Github)

 

Nguồn: https://medium.mybridge.co/39-open-source-swift-ui-libraries-for-ios-app-development-da1f8dc61a0f