V2EX summer1991 的所有回复 第 1 页 / 共 2 页
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX    summer1991    全部回复第 1 页 / 共 2 页
回复总数  21
1  2  
2017-07-15 11:00:19 +08:00
回复了 summer1991 创建的主题 问与答 求问!
@shuirong1997 尴尬
2017-07-03 16:15:11 +08:00
回复了 summer1991 创建的主题 问与答 请教一个客户端编程的问题
@KNOX 如果刷新局部 你还要维护是否变化 以及哪些东西变了。这样就已经使问题复杂化了。如果我和这个人除了关注关系 比如再加一个点赞 局部刷新的逻辑就更复杂了
2017-07-03 11:37:26 +08:00
回复了 summer1991 创建的主题 问与答 请教一个客户端编程的问题
@blacklee 所以你在内存中维护一个我关注的人的 list 然后用 rac ?
2017-07-03 11:36:49 +08:00
回复了 summer1991 创建的主题 问与答 请教一个客户端编程的问题
@KNOX。。。这不就是回调了一下么 跟返回时刷新没有什么区别
2017-07-03 11:35:37 +08:00
回复了 summer1991 创建的主题 问与答 请教一个客户端编程的问题
@tmac6740 你是指本地维护 list 还是网络请求 list ?
@winglight2016 有好的想法吗亲?
@winglight2016 可以这么说,需要重用方法,并且这个方法里面能和 VC 一样,能弹窗,能发起网络请求
2017-07-03 11:29:46 +08:00
回复了 summer1991 创建的主题 iOS 大家好,我又来请教了
@wohenyingyu02 你说的是一种方法 解决方法 1.出来时刷新 (比较浪费网络) 2。 本地维护一个关注的人的列表 (本地处理比较复杂) 有没有简单的方法
2017-07-03 11:27:54 +08:00
回复了 summer1991 创建的主题 iOS 大家好,我又来请教了
@LINAICAI 我举的是一个场景 如果这种情况多了 代码的通知会乱飞 基本处于不可控的状态
2017-07-03 11:26:20 +08:00
回复了 summer1991 创建的主题 iOS 大家好,我又来请教了
@LINAICAI 这样的话 应用内得有多少通知啊 ? 同时应用的内存数据中得存多少数据?
@ichanne 恩 我又参考了下 sunnyx 的博客,感觉这个方法可以试一试 http://blog.sunnyxx.com/2015/12/19/self-manager-pattern-in-ios/
@xiubin 你的方案并没有解决问题 :-(
@ichanne 这样不是把 View 和 Model,网络 这些杂糅在一起吗?
求解答!
@andyL 可能之前没有描述好,大家都抓着代码细节看 我整理了下代码放在 t/368630, 你可以再看看
```Objective-c
//版本 v2

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//store/pref/ASHPrefStore.h

@interface ASHPrefStore : NSObject

+ (BOOL)haveReadBroadcastTip;
+ (void)setHaveReadBroadcastTip;

@end

//store/pref/ASHPrefStore.m

@implementation ASHPrefStore

static NSString *const kHaveReadBroadcastTipKey = @"haveReadBroadcastTip";

+ (BOOL)haveReadBroadcastTip
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kHaveReadBroadcastTipKey];
}

+ (void)setHaveReadBroadcastTip
{
[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:kHaveReadBroadcastTipKey];
}

@end

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//network/ASHNetworkAPI.h

@interface ASHNetworkAPI : NSObject

+ (void)sendBroadcastRequestWithMsg:(NSString *)msg successBlock:(void(^)(void))successBlock failureBlock:(void(^)(NSError *error))failureBlock;

@end

//network/ASHNetworkAPI.m

@implementation ASHNetworkAPI

+ (void)sendBroadcastRequestWithMsg:(NSString *)msg successBlock:(void(^)(void))successBlock failureBlock:(void(^)(NSError *error))failureBlock
{
//send request
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
!successBlock ?: successBlock();
});
}

@end

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//utils/ui/ASHAlertUtils.h

@interface ASHAlertUtils : NSObject

+ (void)showAlertWithController:(UIViewController *)controller msg:(NSString *)msg callback:(void(^)(void))callback;

+ (void)showEditAlertWithController:(UIViewController *)controller title:(NSString *)title placeholder:(NSString *)placeholder callback:(void(^)(NSString *content))callback;

@end

//utils/ui/ASHAlertUtils.m

@implementation ASHAlertUtils

#pragma mark - utils

+ (void)showAlertWithController:(UIViewController *)controller msg:(NSString *)msg callback:(void(^)(void))callback
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:msg preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
!callback ?: callback();
}]];
[controller presentViewController:alert animated:YES completion:nil];
}

+ (void)showEditAlertWithController:(UIViewController *)controller title:(NSString *)title placeholder:(NSString *)placeholder callback:(void(^)(NSString *content))callback
{
UIAlertController *alertCOntroller= [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = placeholder;
}];
[alertController addAction:[UIAlertAction actionWithTitle:@"发送" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSString *cOntent= [[alertController textFields][0] text];
!callback ?: callback(content);
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"Canelled");
}]];
[controller presentViewController:alertController animated:YES completion:nil];
}

@end

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//macro.h

#ifndef weakify
#if __has_feature(objc_arc)
#define weakify( x ) autoreleasepool{} __weak __typeof__(x) __weak_##x##__ = x;
#else // #if __has_feature(objc_arc)
#define weakify( x ) autoreleasepool{} __block __typeof__(x) __block_##x##__ = x;
#endif // #if __has_feature(objc_arc)
#endif // #ifndef weakify

#ifndef normalize
#if __has_feature(objc_arc)
#define normalize( x ) try{} @finally{} __typeof__(x) x = __weak_##x##__;
#else // #if __has_feature(objc_arc)
#define normalize( x ) try{} @finally{} __typeof__(x) x = __block_##x##__;
#endif // #if __has_feature(objc_arc)
#endif // #ifndef @normalize

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//controller/ASHTempViewController.m

@
implementation ASHTempViewController

#pragma mark - app logic

- (void)sendBroadcastWithSuccessBlock:(void (^)(void))successBlock
{
@weakify(self)
void (^showSendBroadcast) (void) = ^{
[ASHAlertUtils showEditAlertWithController:self title:@"发送广播'" placeholder:@"说点什么..." callback:^(NSString *content) {
[ASHNetworkAPI sendBroadcastRequestWithMsg:content successBlock:successBlock failureBlock:^(NSError *error) {
@normalize(self)
!self ?: [ASHAlertUtils showAlertWithController:self msg:error.localizedDescription callback:nil];
}];
}];
};

if ([ASHPrefStore haveReadBroadcastTip]) {
showSendBroadcast();
} else {
NSString *title = @"1、发布广播,全服玩家都可以看到;\n2、禁止发布反动、政治、色情、辱骂、广告等不良言论,否则将会遭到删除、封号处理。";
[ASHAlertUtils showAlertWithController:self msg:title callback:^{
[ASHPrefStore setHaveReadBroadcastTip];
showSendBroadcast();
}];
}
}
```
@blacklist 你还木有看清楚我的问题呀亲
@guomiaoyou7784 上边代码中网络请求的代码在网络请求模块,网络调用代码在 vc 中也只有 一行调用 + block 回调,放到 view model 中只是多增加了一层调用,除了更复杂好像没有什么优化。不同按钮的逻辑放在 viewController 的不同分类中,如果在这个逻辑处理中有一些状态需要放到 vc 中,岂不是很麻烦;而且我觉得分类这种形式使用来增强类本身的功能,如果这些逻辑放在这个类的分类中,且用于被这个类自身调用,是不是比较牵强。有具体的例子可以发出来吗?
@guomiaoyou7784 这个文章我以前看过的,但针对于代码中的上述情况,文章中说的做法没有一个是有效的。能不能将你的想法结合代码具体说明下?
@winglight2016 比如界面上有十个按钮,每个大概都是这个逻辑怎么办?
1  2  
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2203 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 18ms UTC 16:10 PVG 00:10 LAX 08:10 JFK 11:10
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86