从常量类中访问基本URL

时间:2016-06-16 05:43:50

标签: ios objective-c nsurl

我创建了一个类" AppConstant"并为" baseURL"定义了一个全局常量。像这样。    APPCostant.h

#import <Foundation/Foundation.h>

extern NSString * const appBaseUrl;

@interface APPConstant : NSObject
@end

` AppConstant.m

#import "APPConstant.h"

@implementation APPConstant

/** defining base url of server **/
NSString *const AppbaseURL = @"http://www.exapmle.com/";

@end

现在我已经在我的班级中导入AppConstant.h,我想使用基本网址,并尝试构建我的网址,如下所示,但我收到编译时错误。

架构x86_64的未定义符号:   &#34; _appBaseUrl&#34;,引自:        - KKSearchViewController.o中的[KKSearchViewController searchRequest]

 NSURL *url =[NSURL URLWithString:@"search" relativeToURL:[NSURL URLWithString:appBaseUrl]];

我不确定,这里有什么不对。我想要实现的是更清洁和可重复使用的代码,因此我不必更改每个类中的URL。

3 个答案:

答案 0 :(得分:2)

看起来你试图通过在每个viewcontroller中的baseUrl中追加路径来调用API,但是最好通过将路径传递给One Helper Class来完成所有与api调用相关的任务,并将回调中的响应发送到发件人viewController。

在Api Helper Class

 #import "Apicaller.h"
 static NSString *baseUrl = @"http://baseUrl/";

 @implementation Apicaller

 +(void)postToUrl:(NSString*)appendString parametersPassed:(NSDictionary*)parameters completion:(void (^) (NSMutableDictionary *response))completion{
      NSString *url = [NSString stringWithFormat:@"%@%@", baseUrl,appendString];
     //Do urlrequest and return response in completion
     completion(responseObject);


 }


@end  

您可以从任何想要的地方调用此类方法

  [Apicaller postToUrl:path parametersPassed:parameter completion:^(NSMutableDictionary *response) {

       //This is callback Response
        NSLog(@"this is response %@", response);


    }];

答案 1 :(得分:1)

有几种方法可以实现你所追求的目标,不幸的是,你对这两种方法都有所混淆。

第一种方法是全局变量。第二个是类属性。

在你的.h文件中你有一个全局变量,而你的.m文件中你有一种类属性。

如果您想使用全局变量方法,只需从.m文件中删除@implementation

<强> AppConstant.m

 #import "AppConstant.h"

 NSString * const appBaseUrl = @"http://someserver.com";

然后,您可以像在appBaseUrl电话中一样简单地引用URLWithString

第二种方法是使用类级属性。遗憾的是,Objective-C没有类级别属性,因此您必须声明一个返回所需值的类级别函数。但是,您可以使用.访问器在Objective C中引用0参数方法,因此看起来像类属性。

<强> AppConstant.h

#import <Foundation/Foundation.h>

@interface AppConstant : NSObject

+(NSString *)appBaseUrl;

@end

<强> AppConstant.m

#import "AppConstant.h"

@implementation AppConstant

+(NSString *)appBaseUrl {
    return(@"http://someserver.com");
}

@end

在这种情况下,您可以在需要值时使用AppConstant.appBaseUrl

答案 2 :(得分:-1)

使用前缀文件而不是手动导入文件

将新的PCH文件添加到项目中:新文件&gt;其他&gt; PCH文件。 在Tar​​get的Build Settings选项中,将Prefix Header的值设置为您的PCH文件名,项目名称为前缀(即对于名为TestProject的项目和名为MyPrefixHeaderFile的PCH文件,将值TestProject / MyPrefixHeaderFile.pch添加到plist)。

提示:您可以使用$(SRCROOT)或$(PROJECT_DIR)之类的内容来获取将.pch放在项目中的路径。 在Tar​​get的Build Settings选项中,将Precompile Prefix Header的值设置为YES。

for example check this site