A smooth, responsive and flexible messages UI library for iOS apps. Built on top of the awesome Texture (formerly AsyncDisplayKit) framework, it takes full advantage of asynchronous layout and rendering to deliver a "butter smooth" scrolling experience.
- iOS 9 and later.
 - Swift 4.
 - ARC.
 
From CocoaPods:
pod 'AsyncMessagesViewController'  Copy the Source\ directory to your project and install all dependencies.
- Example project
- Run 
pod install. - Open 
AsyncMessagesViewController.xcworkspace. - Enjoy the simple 
ViewController.swiftclass. 
 - Run 
 - Model
- Your message model object should conform to 
MessageDataprotocol. 
 - Your message model object should conform to 
 - View
MessageCellNodeis your friend. Most of the time you don't want to subclass it.- There are 2 basic built-in bubble nodes implemented for you: 
MessageTextBubbleNodefor text based messages andMessageNetworkImageBubbleNodefor remote image based messages. - Need a custom bubble node? Here you go.
 
 - Controller
- Your view controller should subclass 
AsyncMessagesViewController. As you may see, it's a very simple view controller (and should be). Most of the magic is in the data source. - What data source, you may ask. Any data source that conform to 
AsyncMessagesCollectionViewDataSourceprotocol. - There is a default implemention: 
DefaultAsyncMessagesCollectionViewDataSource. This class keeps a sorted list of messages, but doesn't allow you to change them directly. Instead, you must alter messages using given methods in its protocol and let it handle the heavy work. It can (supposedly) smartly determine which cells need to be inserted, deleted and reloaded. Why? because:- Calling 
reloadDatais very expensive onASCollectionView(andASTableView). - Most of the time, inserting/deleting a cell causing UI changes in other cells as well. 
DefaultAsyncMessagesCollectionViewDataSourcecan detect those changes automatically. 
 - Calling 
 MessageCellNodeMetadataprovides runtime-computed information about a message and how its data should be presented in aMessageCellNode. Metadata of a message is often computed based on the relationship with other messages. For example, message's sender name should be displayed if it is an incoming message and is the first one in a set of consecutive messages sent by a same user. Or message's date should be shown if it is the first message sent within a 15 minutes window. This kind of UI logic is encapsulated inMessageCellNodeMetadataFactoryand computed at runtime. Of course you can implement your own logic.
 - Your view controller should subclass 
 
- Custom bubble node:
- Please read this guide on subclassing 
ASDisplayNode. - Implement a factory that conforms to 
MessageBubbleNodeFactoryprotocol. - Inject your factory to 
DefaultAsyncMessagesCollectionViewDataSourcevia its initializer. - Inject the data source to 
AsyncMessagesViewController(also via its initializer). 
 - Please read this guide on subclassing 
 - Custom bubble image's colors:
- Initiate a 
MessageBubbleImageProviderwith whatever colors you want. - Inject it to your data source.
 - Inject the data source to your view controller.
 
 - Initiate a 
 - Custom bubble images:
- Implementing your own 
MessageBubbleImageProvider. - Inject it to your data source.
 - Inject the data source to your view controller.
 
 - Implementing your own 
 - Custom logic for computing cell metadata:
- Subclass 
MessageCellNodeMetadataFactoryand override any neccessary method. - Inject it to your data source.
 - Inject the data source to your view controller.
 
 - Subclass 
 - Custom format for message date:
- Subclass 
MessageTimestampFormatterand overrideattributedTimestamp(NSDate). - Inject it to your data source.
 - Inject the data source to your view controller.
 
 - Subclass 
 - Any customization related to the input toolbar:
- Please take a look at SlackTextViewController itself.
 
 - Other customizations:
- File an issue and I will be more than happy to help :)
 
 
All feedbacks, questions and pull requests are very welcome. See here for details.
Created by Huy Nguyen, an Android developer :)
- Inspried by JSQMessagesViewController and Atlas.
 
AsyncMessagesViewController is released under an MIT License. See here for details.
Copyright © 2015 Huy Nguyen.

