Objective-C类(最佳实践)

Mac*_*ret 0 xml parsing objective-c ios

我有一个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:link]];

[parse setDelegate:self]; [解析解析];

comp(results);
Run Code Online (Sandbox Code Playgroud)

}

Mar*_*ekR 5

你可以使用块:

[parserClass startParsing:link withCompletionBlock:ˆ(NSDictionary *results)
{
    // do something with results
}];
Run Code Online (Sandbox Code Playgroud)

[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);
    }];
}
Run Code Online (Sandbox Code Playgroud)