2012-07-28 19 views
5

NSStream için iş parçacığı işlemini açıklayan düzgün bir belge bulamadım. Spesifik olmak gerekirse, NSInputStream için gidelim. Objective-C'nin benim için işlenmesi şu anda sadece bir gizem. Çünkü basit görünüyor.scheduleInRunLoop - iş parçacıklı ağ bağlantıları

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

Sen oldukça serin olduğunu düşündüm giriş akışı aday olacağını çalıştırmak döngü, belirtebilirsiniz: benim sorum Ne

öncelikle bu hat anlamına gelir. Sorun şu ki, giriş ve çıkış akışlarının kendi iş parçacıklarında çalışmasını istiyorsanız ve her ikisi de tek bir sınıfta, örneğin Bağlantıda, örneklendiğinde, bunları kendi iş parçacıklarında çalışmasını nasıl sağlayabilirsiniz?

Sormamın nedeni delegeler yüzünden. Önceden [inputStream setDelegate:self] yaptık, yani gelen/giden verileri işlemek için stream:handleEvent bildirmeliyiz.

Sonuç olarak benim sorum, giriş ve çıkış akışını oluşturan bir sınıfa sahip olmanız durumunda, her bir akışı nasıl işliyorsunuz ve akış etkinliklerini geçerli sınıfa taşımaya ilişkin sorumluluğu nasıl veriyorsunuz?

    Geçerli sınıfta hem parçacıkları sorumluluğunu temsilci olamaz
  • , sen olurdu:

    [inputStream setDelegate:self]; 
    [outputStream setDelegate:self]; 
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [inputStream open]; 
    [outputStream open]; 
    

    aşağıdaki düşünüyorum: Burada

    chomp için bazı kod nesneleri ayırmak için yetki verin.
  • Her iki akış için bir iş parçacığı mı? (Şahsen böyle düşünmüyorum, çünkü giriş/çıkış eşzamanlı olarak çalışacaktır)
  • Bunu yanlış anlıyorum ve ayrı bir çalışma döngüsü oluşturabilir ve ayrı bir iş parçacığına karşı zamanlama programıRunLoop'u arayabilirsiniz?

Herhangi bir fikir?

cevap

-3
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode 
{ 
    switch (eventCode) { 
     case NSStreamEventNone: 
      break; 
     case NSStreamEventOpenCompleted: 
      break; 
     case NSStreamEventHasBytesAvailable: 
      [self _readData]; 
      break; 
     case NSStreamEventHasSpaceAvailable: 
      [self _writeData]; 
      break; 
     case NSStreamEventErrorOccurred: 
      break; 
     case NSStreamEventEndEncountered: 
      break; 
     default: 
      break; 
    } 
} 
+6

-1 Sadece kod bir cevap değil. Bunu açıklamalısın. Yaptığınız şeyi neden yaptığınız hakkında sadece küçük bir açıklama bile. – Fogmeister

+1

Biraz açıklama iyi olurdu. Bunu reddetmemek için kendimi zorladım .. –

İlgili konular