从常量 class 访问基数 url
Accesing base url from constant class
我创建了一个 class "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
现在我已经在我的 class 中导入了 AppConstant.h
,我想在其中使用基础 url,并尝试像下面那样构建我的 url,但是我得到编译时错误。
未定义的体系结构符号x86_64:
“_appBaseUrl”,引用自:
- [KKSearchViewController searchRequest] 在 KKSearchViewController.o
NSURL *url =[NSURL URLWithString:@"search" relativeToURL:[NSURL URLWithString:appBaseUrl]];
我不确定,这里有什么问题。我想要实现的是更简洁和可重用的代码,这样我就不必在每个 class 中更改 url。
使用前缀文件而不是手动导入文件
向项目中添加新的 PCH 文件:新建文件 > 其他 > 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。
看起来您正试图通过在每个 viewcontroller 的 baseUrl 中附加路径来调用 API,但最好在 One Helper [=] 中完成所有 api 调用相关任务21=] 通过将路径传递给它并将回调中的响应发送给发件人 viewController.
在Api帮手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
您可以从任何地方调用此 Class 方法
[Apicaller postToUrl:path parametersPassed:parameter completion:^(NSMutableDictionary *response) {
//This is callback Response
NSLog(@"this is response %@", response);
}];
有几种方法可以实现您所追求的目标,不幸的是,您混淆了这两种方法。
第一种方法是全局变量。第二个是 class 属性.
在你的 .h 文件中你有一个全局变量,而在你的 .m 文件中你(有点)有一个 class 属性.
如果您想使用全局变量方法,只需从您的 .m 文件中删除 @implementation
:
AppConstant.m
#import "AppConstant.h"
NSString * const appBaseUrl = @"http://someserver.com";
然后您可以像在 URLWithString
调用中一样简单地引用 appBaseUrl
。
第二种方法是使用 class 级别 属性。不幸的是 Objective-C 没有 class 级别属性,因此您必须声明一个 class 级别函数来 returns 您需要的值。但是,您可以使用 .
访问器引用 Objective C 中的 0 个参数方法,因此它 看起来 像 class 级别 属性.
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
。
我创建了一个 class "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
现在我已经在我的 class 中导入了 AppConstant.h
,我想在其中使用基础 url,并尝试像下面那样构建我的 url,但是我得到编译时错误。
未定义的体系结构符号x86_64: “_appBaseUrl”,引用自: - [KKSearchViewController searchRequest] 在 KKSearchViewController.o
NSURL *url =[NSURL URLWithString:@"search" relativeToURL:[NSURL URLWithString:appBaseUrl]];
我不确定,这里有什么问题。我想要实现的是更简洁和可重用的代码,这样我就不必在每个 class 中更改 url。
使用前缀文件而不是手动导入文件
向项目中添加新的 PCH 文件:新建文件 > 其他 > 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。
看起来您正试图通过在每个 viewcontroller 的 baseUrl 中附加路径来调用 API,但最好在 One Helper [=] 中完成所有 api 调用相关任务21=] 通过将路径传递给它并将回调中的响应发送给发件人 viewController.
在Api帮手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
您可以从任何地方调用此 Class 方法
[Apicaller postToUrl:path parametersPassed:parameter completion:^(NSMutableDictionary *response) {
//This is callback Response
NSLog(@"this is response %@", response);
}];
有几种方法可以实现您所追求的目标,不幸的是,您混淆了这两种方法。
第一种方法是全局变量。第二个是 class 属性.
在你的 .h 文件中你有一个全局变量,而在你的 .m 文件中你(有点)有一个 class 属性.
如果您想使用全局变量方法,只需从您的 .m 文件中删除 @implementation
:
AppConstant.m
#import "AppConstant.h"
NSString * const appBaseUrl = @"http://someserver.com";
然后您可以像在 URLWithString
调用中一样简单地引用 appBaseUrl
。
第二种方法是使用 class 级别 属性。不幸的是 Objective-C 没有 class 级别属性,因此您必须声明一个 class 级别函数来 returns 您需要的值。但是,您可以使用 .
访问器引用 Objective C 中的 0 个参数方法,因此它 看起来 像 class 级别 属性.
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
。