2016-09-07 4 views
0

Ich habe ein seltsames Problem mit Zebra-Drucker. Auf dem großen Bild habe ich Codes, um Elemente zu holen, um eins nach dem anderen aus der Warteschlange zu drucken. Wenn also der Druckvorgang initiiert wird und sich drei Elemente in der Warteschlange befinden, wird der Code eine Schleife ausführen und die ersten Daten in der Warteschlange abrufen, sie an den Drucker senden und die ersten Daten in der Warteschlange löschen. So ähnlich wie aus der Warteschlange.Zebra Drucker druckt nur aufeinanderfolgende Etiketten, wenn er vom Benutzer angetippt wird

Das Problem besteht darin, dass der Drucker nur das erste Element druckt, wenn es sich um den Code handelt, der die Daten direkt an den Drucker sendet und sendet. Das nächste Element ist verschwunden, obwohl NSLog anzeigt, dass die Druckerverbindung für jedes einzelne Element geöffnet, Daten gesendet, erfolgreich gedruckt und die Druckerverbindung geschlossen wurde.

Aber wenn jedes Mal der Code ein Etikett drucken, und dann die App zeigt Nachrichtenbox wie "OK drücken, um nächstes Etikett zu drucken", und dann den Benutzer tippen Sie auf die Schaltfläche OK, kann es die zweite und den Rest der drucken beschriften Sie nach jedem Tippen auf die Schaltfläche.

Ich habe dann versucht, dies zu emulieren. Ich habe versucht, Timer zu verwenden, um "den Knopf programmgesteuert zu drücken" [btnPrint sendActionsForControlEvents:UIControlEventTouchUpInside], benutze ich auch Timer, um die Funktion direkt aufzurufen, oder dem Thread Verzögerung zu geben, aber keiner funktioniert. Es muss von einem Knopf initiiert werden, der von menschlicher Berührung angezapft hat. Ich weiß nicht warum.

Hier ist der Code:

// main function to print 
-(void) printLabel { 
    if ([dataToPrint count] > 0) { 
     [self printWithData:[dataToPrint objectAtIndex:0]]; 
    } 
} 

-(void)printWithData:(NSString*) data; 
{ 
    NSString *zplString = data; 
    // do something with zplString 

    NSLog(@"Sending data to printer"); 
    printHandler = [[PrintingHandler alloc] init]; 
    [printHandler setDelegate:self]; 
    [printHandler initialize]; 
    [printHandler printToSerial:bluetoothSerialNumber withData:zplString]; 
} 

// delegate to call if the print is success 
-(void) printIsSuccess 
{ 
    [dataToPrint removeObjectAtIndex:0]; 
    // in here, I just use sleep code instead of button tap emulation to avoid unnecessarily too long code 
    [NSThread sleepForTimeInterval:2.0f]; 
    [self printLabel]; 
} 

// this is method inside PrintingHandler class that get called by PrintingHandler (printToSerial:) 
-(void) printLabelWithData:(NSString*) zplData toPrinter:(NSString*) serial withSender:(id) sender 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ 
     // Instantiate connection to Zebra Bluetooth accessory 
     id<ZebraPrinterConnection, NSObject> thePrinterConn = [[MfiBtPrinterConnection alloc] initWithSerialNumber:serial]; 

     // Open the connection - physical connection is established here. 
     BOOL success = [thePrinterConn open]; 

     NSError *error = nil; 
     // Send the data to printer as a byte array. 
     success = success && [thePrinterConn write:[zplData dataUsingEncoding:NSUTF8StringEncoding] error:&error]; 

     [NSThread sleepForTimeInterval:1.0f]; 
     //Dispath GUI work back on to the main queue! 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (success != YES || error != nil) { 
       [delegate printFailed]; 
       UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
       [errorAlert show]; 
       [errorAlert release]; 
      } 
      else if (success != YES) { 
       NSLog(@"Print is not success, but no error raised"); 
       [delegate printSuccess]; 
      } 
      else 
      { 
       NSLog(@"Print is success"); 
       [delegate printSuccess]; 
      } 
     }); 

     // Close the connection to release resources. 
     NSLog(@"printer connection closed"); 
     [thePrinterConn close]; 

     [thePrinterConn release]; 

    }); 
} 

Antwort

0

Sorry, ich habe die Lösung gefunden. Das Problem ist, dass es zwischen dem Öffnen der Verbindung zum Drucker und dem Senden von Daten an den Drucker zu schnell ist. Ich habe etwas Verspätung gemacht, aber ich habe die Verzögerung auf eine falsche Position gebracht.

So ist der Schritt zur Zeit drucken:

  1. öffnen Bluetooth Druckeranschluss
  2. Daten senden
  3. Verzögerung
  4. Schließen Druckeranschluss

Wenn die richtige sollte sein:

  1. öffnen Bluetooth Druckeranschluss
  2. Verzögerung
  3. Daten sendet
  4. Schließen Druckeranschluss

Hier habe ich die Antwort so die anderen Menschen mit dem gleichen Problem helfen kann.

-(void) printLabelWithData:(NSString*) zplData toPrinter:(NSString*) serial withSender:(id) sender 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ 
     // Instantiate connection to Zebra Bluetooth accessory 
     id<ZebraPrinterConnection, NSObject> thePrinterConn = [[MfiBtPrinterConnection alloc] initWithSerialNumber:serial]; 

     // Open the connection - physical connection is established here. 
     BOOL success = [thePrinterConn open]; 

     NSError *error = nil; 

     [NSThread sleepForTimeInterval:1.0f]; // this is the important one 

     // Send the data to printer as a byte array. 
     success = success && [thePrinterConn write:[zplData dataUsingEncoding:NSUTF8StringEncoding] error:&error]; 

     //Dispath GUI work back on to the main queue! 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (success != YES || error != nil) { 
       [delegate printFailed]; 
       UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
       [errorAlert show]; 
       [errorAlert release]; 
      } 
      else if (success != YES) { 
       NSLog(@"Print is not success, but no error raised"); 
       [delegate printSuccess]; 
      } 
      else 
      { 
       NSLog(@"Print is success"); 
       [delegate printSuccess]; 
      } 
     }); 

     // Close the connection to release resources. 
     NSLog(@"printer connection closed"); 
     [thePrinterConn close]; 

     [thePrinterConn release]; 

    }); 
} 
Verwandte Themen