0

我有一个UIViewController *menuController我调用的地方,所以我的应用程序开始解析 xml 并从结果中NSObject class *parserClass创建一个。NSDictionary我想回到menuController那本词典。

menuController我这样做:

[parserClass startParsing:link];

然后在 parserClass 中一切正常,但是我如何将创建的字典返回给视图控制器。

现在我正在做以下操作,但我现在不是最好的方法:

  • 当解析器完成文档并完成创建字典时,我创建一个带有附加对象的本地通知,并在视图控制器中创建侦听器。当听众收到结果时,我从那里得到那个字典。

有更好的主意吗?谢谢你。

我喜欢块建议,但是如果解析器在到达下面的 comp 行之前没有完成怎么办:

(void)startParsing:link withCompletionBlock:(myCompletion)comp {

parser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL URLWithString:link]];

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

comp(results);

}

4

5 回答 5

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);
    }];
}
于 2013-10-29T13:14:15.910 回答
2

您可以使用以下格式的自定义委托,并且您可以在符合协议后将消息发送到另一个类:-

    @protocol sampleDelegate <NSObject>
    @required
    -(NSString *)getDataValue;
@end
@interface yourClass : NSWindowController<sampleDelegate>
{
    id<sampleDelegate>delegate;
}
@property(readwrite,assign)id<sampleDelegate>delegate;
@end
于 2013-10-29T13:20:03.897 回答
1

您可以使用委托模式: 委托

如果你像我一样喜欢块语法,你可以使用块来达到你的目的:

于 2013-10-29T13:14:37.077 回答
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]



            });
});
于 2013-10-29T13:21:03.990 回答
0

可以在此处找到使用块的实现

于 2013-10-29T13:18:34.980 回答