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

时间:2014-08-25 09:00:07

标签: objective-c

我有一个连接到网络服务的应用。实际调用我已经放入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

我的问题是如何从函数ReturnArray中调用原始视图控制器中的函数?例如更新tableview?或者是在视图控制器中使ReturnArray成为函数的最佳方法,并以某种方式从URL调用中的代码块调用该函数?

由于

2 个答案:

答案 0 :(得分:2)

此案例的最佳解决方案是完成块,您可以像这样使用它:

+ (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世界中更方便和更合适。
  • 您的函数不应该返回任何内容,因为所有处理都是异步执行的,它们会立即返回。

答案 1 :(得分:-1)

尝试使用NSNotificationCenter

向另一个班级发送通知

您必须先在原始视图控制器中注册通知名称:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTableView:) name:@"UpdateTableView" object:nil]; 

然后发布带有参数字典的通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateTableView" object: jsonArray userInfo:nil];