博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第9月第15天 设计模式 adapter mvc
阅读量:4353 次
发布时间:2019-06-07

本文共 11706 字,大约阅读时间需要 39 分钟。

1.

有一道iOS面试题,iOS中都有什么设计模式?很少有答案说包括adapter。

 

gof 书中adapter模式有以下内容:

实现:

。。。

b ) 使 用 代 理 对 象 在这种方法中, T r e e D i s p l a y 将访问树结构的请求转发到代理对象。 T r e e D i s p l a y 的 客 户 进 行 一 些 选 择 , 并 将 这 些 选 择 提 供 给 代理 对 象 , 这 样 客 户 就 可 以 对 适 配 加 以控制,如下图所示。

例 如 , 有 一 个 D i r e c t o r y B r o w s e r , 它 像 前 面 一 样 使 用 T r e e D i s p l a y 。 D i r e c t o r y B r o w s e r 可能 为匹配 T r e e D i s p l a y 和 层 次 目 录 结 构 构 造 出 一 个 较 好 的 代 理 。 在 S m a l l t a l k 或 O b j e c t i v e C 这样的 动态类型语言中,该方法只需要一个接口对适配器注册代理即可。然后 T r e e D i s p l a y 简单地将 请求转发给代理对象。 N E X T S T E P [ A d d 9 4 ] 大 量 使 用 这 种 方 法 以 减 少 子 类 化 。 

 

后来instagram开源了IGListKit,https://github.com/Instagram/IGListKit。就是Adapter模式。

 

@interface IGListAdapter : NSObject/** The view controller that houses the adapter. */@property (nonatomic, nullable, weak) UIViewController *viewController;/** The collection view used with the adapter. */@property (nonatomic, nullable, weak) UICollectionView *collectionView;/** The object that acts as the data source for the adapter. */@property (nonatomic, nullable, weak) id 
dataSource;/** The object that receives top-level events for section controllers. */@property (nonatomic, nullable, weak) id
delegate;/** The object that receives `UICollectionViewDelegate` events. @note This object *will not* receive `UIScrollViewDelegate` events. Instead use scrollViewDelegate. */@property (nonatomic, nullable, weak) id
collectionViewDelegate;/** The object that receives `UIScrollViewDelegate` events. */@property (nonatomic, nullable, weak) id
scrollViewDelegate;/** The updater for the adapter. */@property (nonatomic, strong, readonly) id
updater;/** A bitmask of experiments to conduct on the adapter. */@property (nonatomic, assign) IGListExperiment experiments;/** Initializes a new `IGListAdapter` object. @param updater An object that manages updates to the collection view. @param viewController The view controller that will house the adapter. @param workingRangeSize The number of objects before and after the viewport to consider within the working range. @return A new list adapter object. @note The working range is the number of objects beyond the visible objects (plus and minus) that should be notified when they are close to being visible. For instance, if you have 3 objects on screen and a working range of 2, the previous and succeeding 2 objects will be notified that they are within the working range. As you scroll the list the range is updated as objects enter and exit the working range. To opt out of using the working range, use `initWithUpdater:viewController:` or provide a working range of `0`. */- (instancetype)initWithUpdater:(id
)updater viewController:(nullable UIViewController *)viewController workingRangeSize:(NSInteger)workingRangeSize NS_DESIGNATED_INITIALIZER;/** Initializes a new `IGListAdapter` object with a working range of `0`. @param updater An object that manages updates to the collection view. @param viewController The view controller that will house the adapter. @return A new list adapter object. */- (instancetype)initWithUpdater:(id
)updater viewController:(nullable UIViewController *)viewController;/** Perform an update from the previous state of the data source. This is analogous to calling `-[UICollectionView performBatchUpdates:completion:]`. @param animated A flag indicating if the transition should be animated. @param completion The block to execute when the updates complete. */- (void)performUpdatesAnimated:(BOOL)animated completion:(nullable IGListUpdaterCompletion)completion;/** Perform an immediate reload of the data in the data source, discarding the old objects. @param completion The block to execute when the reload completes. */- (void)reloadDataWithCompletion:(nullable IGListUpdaterCompletion)completion;/** Reload the list for only the specified objects. @param objects The objects to reload. */- (void)reloadObjects:(NSArray *)objects;/** Query the section controller at a given section index. Constant time lookup. @param section A section in the list. @return A section controller or `nil` if the section does not exist. */- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section;/** Query the section index of a list. Constant time lookup. @param sectionController A list object. @return The section index of the list if it exists, otherwise `NSNotFound`. */- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController;/** Returns the section controller for the specified object. Constant time lookup. @param object An object from the data source. @return A section controller or `nil` if `object` is not in the list. @see `-[IGListAdapterDataSource listAdapter:sectionControllerForObject:]` */- (__kindof IGListSectionController * _Nullable)sectionControllerForObject:(id)object;/** Returns the object corresponding to the specified section controller in the list. Constant time lookup. @param sectionController A section controller in the list. @return The object for the specified section controller, or `nil` if not found. */- (nullable id)objectForSectionController:(IGListSectionController *)sectionController;/** Returns the object corresponding to a section in the list. Constant time lookup. @param section A section in the list. @return The object for the specified section, or `nil` if the section does not exist. */- (nullable id)objectAtSection:(NSInteger)section;/** Returns the section corresponding to the specified object in the list. Constant time lookup. @param object An object in the list. @return The section index of `object` if found, otherwise `NSNotFound`. */- (NSInteger)sectionForObject:(id)object;/** Returns a copy of all the objects currently driving the adapter. @return An array of objects. */- (NSArray *)objects;/** An unordered array of the currently visible section controllers. @return An array of section controllers. */- (NSArray
*)visibleSectionControllers;/** An unordered array of the currently visible objects. @return An array of objects */- (NSArray *)visibleObjects;/** An unordered array of the currently visible cells for a given object. @param object An object in the list @return An array of collection view cells. */- (NSArray
*)visibleCellsForObject:(id)object;/** Scrolls to the specified object in the list adapter. @param object The object to which to scroll. @param supplementaryKinds The types of supplementary views in the section. @param scrollDirection An option indicating the direction to scroll. @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes. @param animated A flag indicating if the scrolling should be animated. */- (void)scrollToObject:(id)object supplementaryKinds:(nullable NSArray
*)supplementaryKinds scrollDirection:(UICollectionViewScrollDirection)scrollDirection scrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated;/** Returns the size of a cell at the specified index path. @param indexPath The index path of the cell. @return The size of the cell. */- (CGSize)sizeForItemAtIndexPath:(NSIndexPath *)indexPath;/** Returns the size of a supplementary view in the list at the specified index path. @param elementKind The kind of supplementary view. @param indexPath The index path of the supplementary view. @return The size of the supplementary view. */- (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath;/** :nodoc: */- (instancetype)init NS_UNAVAILABLE;/** :nodoc: */+ (instancetype)new NS_UNAVAILABLE;@end

 

2.

AVIMCMD 只需实现 packToSendData

- (void)sendCustomC2CMsg:(AVIMCMD *)cmd toUser:(id
)recv succ:(TIMSucc)succ fail:(TIMFail)fail{ if (cmd && recv) { TIMConversation *conv = [[TIMManager sharedInstance] getConversation:TIM_C2C receiver:[recv imUserId]]; TIMCustomElem *elem = [[TIMCustomElem alloc] init]; elem.data = [cmd packToSendData]; TIMMessage *timMsg = [[TIMMessage alloc] init]; [timMsg addElem:elem]; [timMsg setPriority:TIM_MSG_PRIORITY_HIGH]; [conv sendMessage:timMsg succ:^{ if (cmd.userAction == AVIMCMD_PACustomMsg) { [self onRecvC2CSender:[IMAPlatform sharedInstance].host customMsg:elem]; } if (succ) { succ(); } } fail:^(int code, NSString *msg) { DebugLog(@"发送消息失败:%@", timMsg); if (fail) { fail(code, msg); } }]; }}...- (NSData *)packToSendData{ NSMutableDictionary *post = [NSMutableDictionary dictionary]; [post setObject:@(self.userAction) forKey:@"userAction"]; if (self.actionParam && self.actionParam.length > 0) { [post setObject:self.actionParam forKey:@"actionParam"]; } if (self.msgId && self.msgId.length > 0) { [post setObject:self.msgId forKey:@"id"]; } if (self.type && self.type.length>0) { [post setObject:self.type forKey:@"type"]; } if (_nickName && _nickName.length > 0) { [post setObject:_nickName forKey:@"NickName"]; } if (_content && _content.length > 0) { [post setObject:_content forKey:@"Content"]; } if (_headUrl && _headUrl.length > 0) { [post setObject:_headUrl forKey:@"HeadUrl"]; } if (_company && _company.length > 0) { [post setObject:_company forKey:@"Company"]; } if (_roomId && _roomId.length > 0) { [post setObject:_roomId forKey:@"RoomId"]; } if (_muteUserId && _muteUserId.length > 0) { [post setObject:_muteUserId forKey:@"MuteUserId"]; } NSLog(@"发送的参数:%@", post); if ([NSJSONSerialization isValidJSONObject:post]) { NSError *error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:post options:NSJSONWritingPrettyPrinted error:&error]; if(error) {// DebugLog(@"[%@] Post Json Error: %@", [self class], post); return nil; } // DebugLog(@"AVIMCMD content is %@", post); return data; } else {// DebugLog(@"[%@] AVIMCMD is not valid: %@", [self class], post); return nil; }}

 

TIMCustomElem *转 TCShowLiveMsg*

// 收到C2C自定义消息- (void)onRecvC2CSender:(id
)sender customMsg:(TIMCustomElem *)msg{ id
cachedMsg = [self cacheRecvC2CSender:sender customMsg:msg]; [self enCache:cachedMsg noCache:^(id
msg){。。。- (id
)cacheRecvC2CSender:(id
)sender customMsg:(TIMCustomElem *)msg{ NSString *datastring = [[NSString alloc] initWithData:msg.data encoding:NSUTF8StringEncoding]; NSLog(@"接收到的消息:%@", datastring); TCShowLiveMsg *cmsg = [NSObject parse:[TCShowLiveMsg class] jsonString:datastring]; cmsg.msgText = cmsg.Content; cmsg.sender = sender; cmsg.isC2CMsg = YES; if (!_isPureMode) { [cmsg prepareForRender]; } return cmsg; }

 

//重写该方法- (id
)cacheRecvGroupSender:(id
)sender customMsg:(TIMCustomElem *)msg;{ NSString *datastring = [[NSString alloc] initWithData:msg.data encoding:NSUTF8StringEncoding]; NSLog(@"接收到的消息:%@", datastring); TCShowLiveMsg *cmsg = [NSObject parse:[TCShowLiveMsg class] jsonString:datastring];

 

3.

 mvc

https://github.com/Yrocky/NetworkCouplerController/ 

转载于:https://www.cnblogs.com/javastart/p/7018062.html

你可能感兴趣的文章
CSS
查看>>
jvm架构以及Tomcat优化
查看>>
数据库の目录
查看>>
vmware安装rhel 7
查看>>
[复合材料] 编织复合材料单胞周期性边界条件编程问题
查看>>
Paxos协议笔记
查看>>
php之快速入门学习-15(php函数)
查看>>
【01背包问题】
查看>>
我所知道的数据库8-DML语言
查看>>
Python学习笔记——面向对象基础
查看>>
SQL Server 2012安装时如何不安装自带的Visual Studio
查看>>
网络传输协议总结(转载)
查看>>
C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 角色权限的配置页面改进优化...
查看>>
如何编写Spring-Boot自动配置
查看>>
(三)Asp.net web api中的坑-【http post请求中的参数】
查看>>
洛谷跑路
查看>>
使用DbProviderFactories.GetFactory方法需要配置数据库提供者
查看>>
Ubuntu || LinuxMint 配置apache虚拟主机
查看>>
HTML—链接
查看>>
将进程设置为守护进程
查看>>