我创建了一个类" 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。
答案 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文件。 在Target的Build Settings选项中,将Prefix Header的值设置为您的PCH文件名,项目名称为前缀(即对于名为TestProject的项目和名为MyPrefixHeaderFile的PCH文件,将值TestProject / MyPrefixHeaderFile.pch添加到plist)。
提示:您可以使用$(SRCROOT)或$(PROJECT_DIR)之类的内容来获取将.pch放在项目中的路径。 在Target的Build Settings选项中,将Precompile Prefix Header的值设置为YES。