我有UIViewController *menuController
我呼叫NSObject
class *parserClass
,因此我的应用程序开始解析xml并从结果中创建NSDictionary
。我想回到menuController
那本词典。
在menuController
我这样做:
[parserClass startParsing:link];
然后在parserClass中一切正常,但是如何将创建的字典返回给视图控制器。
现在我正在进行以下操作,但现在我不是最好的方法:
有更好的想法吗?谢谢。
我喜欢块建议,但是如果解析器在到达下面的comp行之前没有完成该怎么办:
(void)startParsing:link withCompletionBlock:(myCompletion)comp {
parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:链接]];
[parse setDelegate:self]; [解析解析];
comp(results);
}
答案 0 :(得分:5)
您可以使用块:
[parserClass startParsing:link withCompletionBlock:ˆ(NSDictionary *results)
{
// do something with results
}];
[NSXMLParser parse]方法是同步的,因此它将阻塞直到解析完成。因为在这个例子中,使用完成块完全没有意义,因为你可以简单地返回一个值。您要实现的目标可能是在后台线程上运行解析器,然后在完成后通知。如果这是真的那么你可以这样写:
- (void)startParsing:(NSURL *)url withCompletionBlock:ˆ(NSDictionary *results)comp
{
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
ˆ{
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:weakSelf];
[parser parse];
comp(weakSelf.results);
}];
}
答案 1 :(得分:2)
您可以使用下面的自定义代理格式,并且您可以在符合协议后将消息发送到另一个类: -
@protocol sampleDelegate <NSObject>
@required
-(NSString *)getDataValue;
@end
@interface yourClass : NSWindowController<sampleDelegate>
{
id<sampleDelegate>delegate;
}
@property(readwrite,assign)id<sampleDelegate>delegate;
@end
答案 2 :(得分:1)
您可以使用委派模式: Delegation
如果你喜欢像我这样的块语法,你可以使用块来达到你的目的: Blocks
答案 3 :(得分:1)
您可以使用Grand Central Dispatch更快地实现这一目标并使用更清晰的代码。首先在后台队列中调度解析,然后更新主线程上的UI(您应该始终更新主队列上的UI),如下所示:
dispatch_queue_t jsonParsingQueue = dispatch_queue_create("jsonParsingQueue", NULL);
// execute a task on that queue asynchronously
dispatch_async(jsonParsingQueue, ^{
// do the parsing here
// UI update code on the main thread (delegates, notifications, UI updates...)
dispatch_async(dispatch_get_main_queue(), ^{
//Update your UI here, for example [tableview reloadData]
});
});
答案 4 :(得分:0)
可以找到使用块的实现here