2011-01-18 22 views
5

Tôi sử dụng AsyncSocket trên iPhone để liên lạc với máy chủ. AsyncSocket được dựa trên các vòng chạy nhưng ứng dụng của tôi dựa trên các luồng. Điều đó có nghĩa, tôi bắt đầu một chủ đề mới để ghi dữ liệu và đợi cho đến khi một phản hồi được nhận trên cùng một luồng. Nhưng tôi không thể gọi phương thức của một AsyncSocket trực tiếp từ chủ đề khác, tôi phải sử dụng:Sử dụng AsyncSocket với các chuỗi phụ trên iPhone

[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES]; 

Nó làm việc, nhưng tôi có thể không nhận được phản hồi từ phương pháp của tôi "writeSomeData:" được gọi theo cách này, vì performSelectorOnMainThread lợi nhuận không có gì.

Phương pháp writeSomeData: làm điều gì đó như thế này:

-(NSData *)writeData:(NSData *)dataToWrite { 
    dataReceived = nil; // AsyncSocket writes data to this variable 
    [asyncSocket writeData:dataToWrite withTimeout:-1 tag:0]; 
    [asyncSocket readDataToData:[@"<EOF" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; 
    int counter = 0; 
    while (dataReceived == nil && counter < 5) { 
     // runLoop is [NSRunLoop currentRunloop] 
     [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 
     ++counter; 
    } 

    return [dataReceived copy]; 
} 

tôi có thể nhận được phản ứng bằng cách truy cập biến lớp "dataReceived", nhưng đó là nội dung được thay đổi vào lúc này. Ai có thể cho tôi biết cách sử dụng AsyncSocket (hoặc nói chung, cách xử lý các lớp dựa trên vòng lặp chạy) trên các luồng riêng biệt, để nếu tôi gọi phương thức của lớp đó sẽ chặn cho đến khi phương thức được thực thi và phản hồi là nhận?

Cảm ơn bạn.

+1

Tại sao bạn sẽ muốn điều đó kịch bản ở nơi đầu tiên? Tại sao tạo ra một sợi nếu điều đầu tiên (dường như) bạn làm là chặn nó cho đến khi một số quặng ít hơn trong tương lai tùy ý? Tại sao không bắt đầu toàn bộ điều từ luồng với runloop và gửi _result-data_ để xử lý trên một 'NSOperationQueue' hoặc một trong toàn cục' dispatch_queue's? – danyowdee

Trả lời

-1

Hãy thử sử dụng GCD (Grand Central Dispatch) để ghi dữ liệu của bạn trên một sợi riêng biệt và quay trở lại luồng chính khi dữ liệu được ghi. Bạn có thể làm điều đó như thế này:

// call this on the main thread 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    NSData *data = [self writeData:dataToWrite]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do something with the data on the main thread. 
    }); 
}); 

Tôi hy vọng một cái gì đó như thế này có thể giúp bạn ...

Các vấn đề liên quan