我想做的就是为我的(流捕获)应用程序创建一个实用程序类,从我的网站获取设置.我想从其他文件中调用它作为一个简单的[RemoteConfig updateSettings];
我的目标是使用这个远程配置实用程序,而不是为我抓取远程设置的每种情况制作一个对象.
Objective C中的静态/类变量和方法的信息是模糊的,非常自以为是,所以经过大量的实验,我得到了这个.但它看起来很有趣,这让我觉得有些不对劲.
RemoteConfig.h只是声明(void)updateSettings方法.
这是我的RemoteConfig.m:
#import "RemoteConfig.h" static NSMutableData* _configData; static Nsstring* url = @"http://local.namehidden.com:90/json.html"; static int try; @implementation RemoteConfig +(void) updateSettings { Nsstring *identifier = [[[UIDevice currentDevice] identifierForvendor] UUIDString]; //Create URL request NSMutableuRLRequest *request = [NSMutableuRLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval: 10]; [request setHTTPMethod: @"POST"]; Nsstring *post = [Nsstring stringWithFormat:@"id=%@",identifier]; NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:postData]; NSURLConnection* connection = [NSURLConnection connectionWithRequest:request delegate:self]; [connection start]; } ///////////////////////////// DELEGATE METHODS /////////////////////////////////// +(void)connection:(NSConnection*)conn didReceiveResponse:(NSURLResponse*)response { if (_configData == NULL) { _configData = [[NSMutableData alloc] init]; } [_configData setLength:0]; NSLog(@"didReceiveResponse: responseData length:(%d)",_configData.length); } /// and so on...
它看起来很时髦,将C风格的变量放在@interface / @实现之上.很多人说尝试使用属性,有人说做静态方法单例技巧,我见过一个处理单例的小库,但这是我发现的最简单的解决方案.
我的问题 –
>这听起来很糟糕吗?
>这有什么限制?
>有哪些替代方案,什么是最好的?
解决方法
Is this proverbially bad? What limitations does this have?
全局变量往往会施加一系列限制:
>他们通常不会妥善清理资源
>不是线程安全的(例如,可以从一个线程使用或者可以为每个线程引入状态)
>它们可能不一定安全
>他们可以通过序列化请求来解决其中的一些问题 – 引入过多的暂停和锁定.
>它们变得非常难以安全地“扩展”(即添加全局变量使其更加脆弱)
>它们很难测试,并且可能导致很难再现的错误
What are the alternatives,and what is best?
只需将这些变量移动到ivars,并创建类的实例而不是依赖于全局状态.然后,您可以以不会显着影响客户的方式进行扩展和抽象.
注意静态Nsstring * const url = @“http://local.namehidden.com:90/json.html”;不会是一个可变变量(添加const).所以它只是_configData并尝试哪些需要是ivars.