Objective-C类(最佳实践)

时间:2013-10-29 13:10:30

标签: ios objective-c xml parsing

我有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);
     

}

5 个答案:

答案 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