从常量 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。

for example check this site

看起来您正试图通过在每个 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