1

いくつかの異なるviewControllerを持つチャットアプリを書いています。

サーバーからの新しいメッセージをリッスンするために Singelton を実装しました。新しいメッセージを受け取ったら、別の viewController( TabFirstViewController) 内の正しい TableView を更新したい その viewController 内のテーブルが呼び出されvisitorsTableViewます。

これが私の現在のシングルトンの実装です:

#import "ChatDataController.h"
#import "TabFirstViewController.h"

@implementation ChatDataController
{
    ChatDataController * anotherSingles;
}

@synthesize enString;
@synthesize enInt;
@synthesize messages;


+ (ChatDataController *)sharedInstance
{
    static dispatch_once_t once;
    static ChatDataController *chatDataController;
    dispatch_once(&once, ^ { chatDataController = [[ChatDataController alloc] init];});
    return chatDataController;
}


- (id)init
{
    self = [super init];

    if (self) {
        messages = [[NSMutableArray alloc] init];
    }

    return self;
}

// Open connection to server
- (void)initNetworkCommunication {
    isConnected = TRUE;
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 8080, &readStream, &writeStream);
    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;

    [inputStream setDelegate:self];
    [outputStream setDelegate:self];

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [inputStream open];
    [outputStream open];
}

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {

    NSLog(@"stream event %i", streamEvent);


    switch (streamEvent) {

        case NSStreamEventOpenCompleted:
            NSLog(@"Stream opened");
            break;
        case NSStreamEventHasBytesAvailable:

            if (theStream == inputStream) {

                uint8_t buffer[1024];
                int len;

                while ([inputStream hasBytesAvailable]) {
                    len = [inputStream read:buffer maxLength:sizeof(buffer)];
                    if (len > 0) {

                        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                        if (nil != output) {

                            NSLog(@"server said: %@", output);
                            [self messageReceived:output];

                        }
                    }
                }
            }
            break;


        case NSStreamEventErrorOccurred:

            NSLog(@"Can not connect to the host!");
            isConnected = 0;
            break;

        case NSStreamEventEndEncountered:

            [theStream close];
            [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            //[theStream release];
            theStream = nil;

            break;
        default:
            NSLog(@"Unknown event");
    }

}

// I want to update the table from this method...
- (void) messageReceived:(NSString *)message {

    [self.messages addObject:message];

    /**
    * Trying to update the table..
    */
    TabFirstViewController *controller = [[TabFirstViewController alloc] init];

    NSString *s = (NSString *) [NSIndexPath indexPathForRow:messages.count-1 inSection:0];


    NSIndexPath *topIndexPath = [NSIndexPath indexPathForRow:messages.count-1
                                                   inSection:0];
    [controller.visitorsTableView scrollToRowAtIndexPath:topIndexPath
                      atScrollPosition:UITableViewScrollPositionMiddle
                              animated:YES];

    [controller.visitorsTableView reloadData];
}

@end

visitorsTableViewテーブルを更新するにはどうすればよいですか? サーバーから新しいメッセージを受け取るたびに、最新の状態に維持したいと考えています。

それぞれがtableViewを含むより多くのviewControllerを持っていると言わなければならないので、それらも同様に更新できるようにしたい..

4

2 に答える 2

0

新しいメッセージを受信したときに通知を受け取るには、通知を使用することをお勧めします。通知コールバックを使用して、テーブル ビューをリロードできます。

于 2013-08-01T10:54:22.080 に答える
0

メッセージを受信するたびにテーブル ビューを初期化することはできません。2 つの方法があります。1. デリゲート パターンを使用します。呼び出しを単一のハンドラーに委任する必要がある場合に推奨されます。 2. ローカル通知を使用する 同じ通知に複数のハンドラーがある場合に推奨されます。(チャットアプリにはこれをお勧めします)

于 2013-08-01T10:52:37.430 に答える