Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C如何从NSObjects调用原始视图控制器中的函数_Objective C - Fatal编程技术网

Objective-C如何从NSObjects调用原始视图控制器中的函数

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

我有一个连接到web服务的应用程序。我对NSObject的实际调用仅仅是因为我在不同的屏幕上有几个连接到web服务的点

因此,我的NSObject文件如下所示:

#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*)函数