0

UITableViewインターネットから解析されたXML要素が入力されているがあります。

すべて正常に機能していますが、XLM要素を解析するコードを、これを設定するコードから分離したいと思いUIViewControllerますUITableView

をサブレーザーで試しましたUIViewControllerが、多くの結合の問題が発生しているようです。

UIViewControllerこのXML非同期パーサーコードを分離し、その結果をを含むにフィードする最良の方法は何UITableViewですか?

私は代表者の多くを理解していませんが、これは進むべき道ですか?

ありがとう!

4

2 に答える 2

1

解析を処理するオブジェクトを作成し、View Controllerでそのインスタンスを作成してから、それを呼び出してデータをロードします。

@protocol SomeXMLParserHandler <NSObject>

- (void) handleData:(NSArray *)data;

@end

@interface SomeXMLParser : NSObject<NSXMLParserDelegate>

@property (strong, nonatomic) id<SomeXMLParserHandler> handler;

- (void) parseSomeXMLFromURL:(NSString *)url
            andPassToHandler:(id<SomeXMLParserHandler>)handler;

@end

この例では、SomeXMLParserはすべての面倒な作業を行い、完了時に配列をSomeXMLParserHandlerに返します。したがって、View Controllerで、次のようなことを行うことができます。

- (void) viewDidLoad
{
    [super viewDidLoad];

    SomeXMLParser *parser = [[SomeXMLParser alloc] init];

    [parser parseSomeXMLFromURL:@"http://someurl"
               andPassToHandler:self];
}

- (void) handleData:(NSArray *)data
{
    self.tableViewData = data;
}

これは機能するコードではありませんが、特に解析コードがすでに機能している場合は、正しい方向に進むはずです。また、ブロックに参加している場合は、プロトコルをブロック参照と交換して、解析が完了したら作業を行うことができます。

于 2012-08-02T19:41:51.173 に答える
1

モデルはデータのフェッチと解析を処理する必要があります。処理が完了すると、NSNotificationCenterを使用して新しいデータについてViewControllerに通知できます。
たとえば、次のように実行できます。

モデルでいくつかを定義MyModelDidFinishFetchingDataNotificationし、データのフェッチと解析が終了したらそれを呼び出します

次に、viewControllerを作成するときに、それをオブザーバーとしてモデル通知に追加します

- (id)init
{
    self = [super init];
    if (self) {
        //
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(handleMyModelDidFinishFetchingDataNotification:)
                                                     name:MyModelDidFinishFetchingDataNotification
                                                   object:nil];
    }
    return self;
}  

viewDidLoadで、データをフェッチするようにモデルに指示します

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.myModel fetchNewDataFromServer];
}  

新しいデータを処理するメソッドを実装します

- (void)handleMyModelDidFinishFetchingDataNotification:(NSNotification *)not
{
    NSArray *newData = [[not userInfo] objectForKey:@"someNewData"];

    // set the new data to the viewController data property
    self.myData = newData

    // update the UI
    [self.tableView reloadData];
}
于 2012-08-02T19:33:55.320 に答える