Objective-C如何从NSObjects调用原始视图控制器中的函数
我有一个连接到web服务的应用程序。我对NSObject的实际调用仅仅是因为我在不同的屏幕上有几个连接到web服务的点 因此,我的NSObject文件如下所示:Objective-C如何从NSObjects调用原始视图控制器中的函数,objective-c,Objective C,我有一个连接到web服务的应用程序。我对NSObject的实际调用仅仅是因为我在不同的屏幕上有几个连接到web服务的点 因此,我的NSObject文件如下所示: #import <Foundation/Foundation.h> @interface NSURL_Layer : NSObject + (NSArray*) GetProductIdentifiers; + (NSArray*) ReturnArray:(NSData*)json; @end #import
#import <Foundation/Foundation.h>
@interface NSURL_Layer : NSObject
+ (NSArray*) GetProductIdentifiers;
+ (NSArray*) ReturnArray:(NSData*)json;
@end
#import "NSURL Layer.h"
@implementation NSURL_Layer
+ (NSArray*) GetProductIdentifiers : (void*) function
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* kivaData = [NSData dataWithContentsOfURL:
[NSURL URLWithString:@"blah blah"]
];
dispatch_async(dispatch_get_main_queue(), ^{
function:[self ReturnArray: kivaData];
});
});
return NULL;
}
+ (NSArray*) ReturnArray:(NSData*)json{
//Convert data here from json to nsarray
NSError *jsonError;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingAllowFragments error:&jsonError];
return jsonArray;
}
@end
#导入
@接口NSURL_层:NSObject
+(NSArray*)获取产品标识符;
+(NSArray*)ReturnArray:(NSData*)json;
@结束
#导入“NSURL Layer.h”
@NSURL_层的实现
+(NSArray*)GetProductIdentifiers:(void*)函数
{
调度异步(调度获取全局队列(调度队列优先级默认为0)^{
NSData*kivaData=[NSData DATA带内容URL:
[NSURL URLWithString:@“诸如此类”]
];
dispatch\u async(dispatch\u get\u main\u queue()^{
函数:[自返回数组:kivaData];
});
});
返回NULL;
}
+(NSArray*)返回数组:(NSData*)json{
//在此将数据从json转换为nsarray
n错误*jsonError;
NSArray*jsonArray=[NSJSONSerialization JSONObjectWithData:json选项:NSJSONReadingAllowFragments错误:&jsonError];
返回jsonArray;
}
@结束
我的问题是如何从函数ReturnArray调用原始视图控制器中的函数?例如,是否更新tableview?或者,让ReturnArray在视图控制器中创建一个函数,并在URL调用中从代码块调用该函数的最佳方法是什么
谢谢尝试使用
NSNotificationCenter
向其他班级发送通知:
您必须首先在原始视图控制器中注册通知名称:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTableView:) name:@"UpdateTableView" object:nil];
然后发布带有参数字典的通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateTableView" object: jsonArray userInfo:nil];
对于这种情况,最好的解决方案是完成块,您可以这样使用它:
+ (void)getProductIdentifiers:(void (^)(NSArray*, NSError*))completionBlock
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* kivaData = [NSData dataWithContentsOfURL:
[NSURL URLWithString:@"blah blah"]
];
NSArray* array = ... // parse JSON, still in background queue
NSError* error = ... // get error if there's any
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(array, error);
});
});
}
[NSURL_Layer getProductIdentifiers: ^void (NSArray* array, NSError* error) {
if (error == nil)
{
// use array
}
[tableView reloadData];
}];
您可以这样使用它:
+ (void)getProductIdentifiers:(void (^)(NSArray*, NSError*))completionBlock
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* kivaData = [NSData dataWithContentsOfURL:
[NSURL URLWithString:@"blah blah"]
];
NSArray* array = ... // parse JSON, still in background queue
NSError* error = ... // get error if there's any
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(array, error);
});
});
}
[NSURL_Layer getProductIdentifiers: ^void (NSArray* array, NSError* error) {
if (error == nil)
{
// use array
}
[tableView reloadData];
}];
请注意此处的一些差异:
- 您在后台队列中进行同步web调用,这没关系,但您在主队列中解析JSON——这不好,也可以在后台队列中执行(您可以在我的代码示例中看到)李>
- 我将函数替换为块,因为它更方便,更适合Objective-C世界李>
- 函数不应该返回任何内容,因为所有处理都是异步执行的,并且它们会立即返回
+(NSArray*)产品标识符
和+(NSArray*)returnArray:(NSData*)json
还要注意删除get
objective-c通常不使用get
。不是说你不应该使用get
,但是在这种情况下你不需要使用它。最后,为什么要声明像+(NSArray*)GetProductIdentifiers这样的方法代码>在接口文件中,但在实现中有+(NSArray*)GetProductIdentifiers:(void*)函数
注意额外的:(void*)函数
?