1

皆さんが私を助けてくれることを願っています:)

メイン スレッドで NSOperation を作成し、それをキューに追加します。その操作は、NSURLConnection を使用してデータ サーバーに接続し、receivedData を保存して解析することです。

Operation.m

- (void)start
{
    NSLog(@"opeartion for <%@> started.", [cmd description]);

    [self willChangeValueForKey:@"isExecuting"];
    _isExecuting = YES;
    [self didChangeValueForKey:@"isExecuting"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url];

    [request setHTTPMethod:@"POST"];
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", m_BOUNDARY] forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:_postData];

    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    if (_connection == nil)
        [self finish];
}

次に、この NSURL デリゲート メソッドで、サーバーから受け取ったばかりのデータを解析します。

Operation.m

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [self parseItems];
}

データには、たとえば、到着時に描画するためにメイン スレッドに送信する screenItem、CellItem、TextItem などの項目があります。(itemTable が届いたら UITableView を作成し、itemWeb が届いたら UIWebView を作成します)

これを使用して、アイテムをメインスレッドに送信します。

Operation.m

- (void) parseItems 
{
    while ([_data length] > 0)
    {
        NSInteger type = [self _readByte];

        switch (type) 
        {
            case SCREEN:
            {
                [self _send: [self _readScreen]];
                break;
            } 
            case CELL:
            {
                [self _send: [self _readCell]];
                break;
            } 

            // ... A lot of different items
        }
    }
}

- (void)_send:(CItem*)_item
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"newItem" object:_item];
}

次に、通知レシーバーで:

AppDelegate.m

- (void) _newItemArrived:(NSNotification *) notification
{
    [self performSelectorOnMainThread:@selector(processItem:) withObject:[notification object] waitUntilDone:NO];
}

私の問題は、NSOperation が終了するまで UI が描画されないことです。別のスレッドである NSOpertion はメイン スレッドをブロックしないと思いましたが、それが起こっていることだと思います。

この問題のヒントはありますか?

読んでくれてありがとう!

4

2 に答える 2

0

だから私はこれがかなり古い質問であることを知っていますが、同じ問題に遭遇し、ドキュメントとブログを何時間も調べた後、Wim Haanstra http://www.depl0y.com/?p=345からのこの投稿で素晴らしい解決策を見つけました

データが返されるまで NSOperation を無限ループに入れるとうまくいくはずです!

于 2011-10-19T16:38:36.577 に答える
0

を使用していNSOperationQueueますか?

NSOperation は UI 描画をブロックしますか?という質問に対するこの回答を確認してください。別のスレッドで非同期に実行されている NSOperation からの通知で UI を更新する方法の簡単な例については、 を参照してください。

アップデート

  1. NSURLConnection は、デリゲートを使用して単独で非同期接続をサポートします。これを使うべきです。特定の問題がある場合は、それらについて説明する必要があります。
  2. ASIHTTPRequestライブラリを確認してください。
  3. 本当にこのアプローチを使用したい場合は、(クラス メソッドsendSynchronousRequest:returningResponse:error:を使用して) NSURLConnection を同期的に実行してみてください。接続はバックグラウンド スレッド上にあるため、アプリの応答性は維持されます。ただし、すべてのデータを受信するまでは何も更新できません。
于 2010-01-22T11:18:00.997 に答える