我有一个连接到网络服务的应用。实际调用我已经放入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调用中的代码块调用该函数?
由于
答案 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];
}];
请注意这里的一些差异:
答案 1 :(得分:-1)
尝试使用NSNotificationCenter
您必须先在原始视图控制器中注册通知名称:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTableView:) name:@"UpdateTableView" object:nil];
然后发布带有参数字典的通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateTableView" object: jsonArray userInfo:nil];