2017-02-10 3 views
9

का उपयोग करके प्रिंट करता है I SDK का उपयोग करके Epson TM-T20 पर कुछ प्रिंट करने के लिए निम्न कोड का उपयोग कर रहा हूं। समस्या यह है कि ऐप केवल एक बार प्रिंट करता है। फिर से प्रिंट करने में सक्षम होने के लिए ऐप को पुनरारंभ करना होगा। कोड के साथ क्या गलत है?आईओएस केवल एक बार Epos2 प्रिंटर

printer = Epos2Printer(printerSeries: 2, lang: 1) 
    printer?.setReceiveEventDelegate(self) 
    printer?.addText("text") 

    printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT)) 
    printer!.beginTransaction() 

    printer?.sendData(Int(EPOS2_PARAM_DEFAULT)) 
    printer?.endTransaction() 
    // printer?.disconnect() 
    printer?.clearCommandBuffer() 
    printer?.setReceiveEventDelegate(nil) 

दस्तावेज में इस्तेमाल किया जा रहा होने के बावजूद, printer?.disconnect() का उपयोग करके ऐप फ्रीज बनाता है, तो मैं इसे बाहर टिप्पणी करने के लिए किया था।

यदि आप एपीआई दस्तावेज को देखना चाहते हैं, तो the SDK's download के अंदर एक पीडीएफ है।

अद्यतन: अद्यतन उत्तर के आधार पर कोड (एप्लिकेशन को अभी भी जमा):

func printReceipt() { 
    var printer: Epos2Printer? 
    printer = Epos2Printer(printerSeries: 2, lang: 1) 
    if printer == nil { 
     print(“Printer not found!! 11") 
    } 
    printer?.setReceiveEventDelegate(self) 

    printer?.addTextFont(2) 
    printer?.addTextSize(1, height: 1) 
    printer?.addText(“My Text") 
    printer?.addFeedUnit(10) 
    printer?.addCut(0) 

    var result: Int = Int(EPOS2_SUCCESS.rawValue) 

    result = Int(printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT))); 
    result = Int(printer!.beginTransaction()) 

    printer?.sendData(Int(EPOS2_PARAM_DEFAULT)) 

    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
     printer?.clearCommandBuffer() 
     printer?.setReceiveEventDelegate(nil) 
     printer?.endTransaction() 
     printer?.disconnect() 
     printer = nil; 
    } 
    } 
+0

कोई फर्क नहीं पड़ता है जहाँ मैं डिस्कनेक्ट (कहते हैं), यह हमेशा एप्लिकेशन जमा। यदि मैं इसका उपयोग नहीं करता हूं, तो प्रिंटर को ऐप द्वारा कब्जा कर लिया जाता है ताकि कोई भी मेरे बाद कई मिनट तक प्रिंट न कर सके। – Linus

उत्तर

1

मैं यन चेन और आरजेक्रूज़ द्वारा प्रदान किए गए समान कोड का उपयोग करता हूं। मेरा प्रिंटर भी एक ईपीएसन टीएम-टी 20 है। मैंने पाया है कि डिस्कनेक्ट() फ़ंक्शन स्वयं ही मेरे ऐप को स्थिर करता है, इससे कोई फर्क नहीं पड़ता कि यह कहां रखा गया है।डिस्कनेक्ट() पूरी तरह से बचने के लिए एकमात्र कामकाजी समाधान किया गया है। तो फ्रीज से बचने के लिए, आप डिस्कनेक्ट() फ़ंक्शन को हटाकर, rjcruz द्वारा प्रदान किए गए कोड को आजमा सकते हैं। उम्मीद है कि यह मदद करता है!

नमूना कोड:

func print() { 
     printer = Epos2Printer(printerSeries: 2, lang: 1) 
     printer?.setReceiveEventDelegate(self) 
      printer?.addTextSize(2, height: 2) 
      printer?.addText("My text")    
      printer?.addFeedUnit(10) 
      printer?.addCut(0) 
     printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT)) 
     printer!.beginTransaction() 
     printer?.sendData(Int(EPOS2_PARAM_DEFAULT)) 
} 

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 
      printer?.clearCommandBuffer() 
      printer?.setReceiveEventDelegate(nil) 
      printer?.endTransaction() 
} 
+0

यह वास्तव में मुझे आवश्यक समाधान है। – Linus

2

SDK में आईओएस डेमो के अनुसार, डिस्कनेक्ट कार्रवाई एक उप-धागा में होना चाहिए, तो आप ऐप को फ्रीज से बच सकते हैं। मुझे लगता है कि डिस्कनेक्ट() फ़ंक्शन को सफलतापूर्वक कॉल करने के बाद यह एक से अधिक बार प्रिंट करने में सक्षम होगा।

कोशिश (Swift3):

DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
    printer?.endTransaction() 
    printer?.disconnect() 

    DispatchQueue.main.async { 
     //Do UI updating work in Main thread, like enable Print button again. 
    } 
} 
+0

आपके उत्तर के लिए धन्यवाद लेकिन ऐप अभी भी इस तरह से जम जाता है। – Linus

+0

कृपया अपना अद्यतन कोड दिखाएं। –

+0

मैंने अपने प्रश्न को अद्यतन कोड के साथ अपडेट किया है। – Linus

2

मैं एक ही मुद्दा था, तो आप Epos2PtrReceiveDelegate लागू करने के लिए है और onPtrReceive का उपयोग कर अपने प्रोटोकॉल के अनुरूप है और कि प्रतिनिधि के अंदर प्रिंटर के रखती शामिल ।

यहाँ एक कोड नमूना है:

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 
 
     
 
    printerObj.endTransaction() 
 
    printerObj.disconnect() 
 
    printerObj.clearCommandBuffer() 
 
    printerObj.setReceiveEventDelegate(nil) 
 
}

4

मैं एक ही मुद्दा है, तो आप Epos2PtrReceiveDelegate लागू करने के लिए है और इसके प्रोटोकॉल onPtrReceive और भी शामिल है का उपयोग कर के अनुरूप है उस प्रतिनिधि के अंदर प्रिंटर को डिस्कनेक्ट करना।

यहां नमूना हैं:

आशा है कि इससे आपकी मदद मिलेगी!

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 

     printerObj.endTransaction() 
     printerObj.disconnect() 
     printerObj.clearCommandBuffer() 
     printerObj.setReceiveEventDelegate(nil) 

    } 

चीयर्स!

+0

आपके उत्तर के लिए धन्यवाद। तो प्रतिनिधि विधि के अंदर डिस्कनेक्ट का उपयोग करना केवल संभव है? और क्या यह एक समस्या नहीं है तो इसे अतुल्यकालिक रूप से उपयोग न करें? – Linus

+0

हां भाई, आपको एसिंक्रोनस विधि की आवश्यकता नहीं है क्योंकि प्रतिनिधि को सही तरीके से लागू करने के बाद इसे हमेशा भेज दिया जाता है जब sendData समाप्त होता है। इसलिए उस प्रतिनिधि में आप अपने वर्तमान प्रिंटर ऑब्जेक्ट को डिस्कनेक्ट कर सकते हैं ताकि अगली बार जब आप प्रिंटर को फिर से कॉल कर सकें तो यह एक नया प्रिंटर ऑब्जेक्ट उत्पन्न करेगा। – rjcruz

+0

यह बहुत प्रबुद्ध है, स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! मैं इसे आशंका कोशिश करूंगा। – Linus

3

भविष्य के संदर्भ के लिए।

कृपया नमूना कोड देखें:

class ReportsViewController: UIViewController, Epos2PtrReceiveDelegate { 

    func printReport() { 

     let header = printer_model.getReportHeader() 
     let content = printer_model.getReportContent() 

     printer = Epos2Printer(printerSeries: EPOS2_TM_T88.rawValue, lang: EPOS2_MODEL_ANK.rawValue) 

     printer!.setReceiveEventDelegate(self) 

     printer!.addFeedLine(1) 

     printer!.addTextFont(1) 
     printer!.addTextAlign(1) 

     let logoData = UIImage(named: "logo.png") 

     printer!.add(logoData!, x: 0, y:0, 
        width:Int(logoData!.size.width), 
        height:Int(logoData!.size.height), 
        color:EPOS2_COLOR_1.rawValue, 
        mode:EPOS2_MODE_MONO.rawValue, 
        halftone:EPOS2_HALFTONE_DITHER.rawValue, 
        brightness:Double(EPOS2_PARAM_DEFAULT), 
        compress:EPOS2_COMPRESS_AUTO.rawValue) 

     printer!.addText("\n") 
     printer!.addText(header) 
     printer!.addText(content) 
     printer!.addText(constants.PRINTER_LINE) 

     printer!.addFeedLine(1) 

     printer!.addCut(EPOS2_CUT_FEED.rawValue) 

     let status = printer!.connect("TCP:\(PRINTER_IP_ADDRESS)", timeout: PRINTER_TIMEOUT) 

     if status != 0 { 

      // error 
      // handle your logic here if you cannot connect to the printer 

      self.printerErrorPrompt() 

     } else { 

      // send your data to the printer 

      printer!.beginTransaction() 
      printer!.sendData(Int(EPOS2_PARAM_DEFAULT)) 

     } 
    } 

} 

यहाँ लागू प्रतिनिधि विधि

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 
     DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async(execute: { 
      printerObj.endTransaction() 
      printerObj.disconnect() 
      printerObj.clearCommandBuffer() 
      printerObj.setReceiveEventDelegate(nil) 
     }) 


} 

चीयर्स!

+0

मुझे लगता है कि आप प्रिंटर ओबीजे को प्रतिनिधि संदेश में PtrReceive पर संदेश भेजते हैं। ध्यान दें कि Epson SDK दस्तावेज़ स्पष्ट रूप से इस समय संदेश नहीं भेजता है। मैं बाद में निष्पादन के लिए एक ब्लॉक भेजता हूं। –

+0

मेरे मामले में मुझे एक समस्या का सामना करना पड़ता है जो दाएं तरफ से प्राप्ति है, यह पूरे प्रिंट नहीं करता है। कागज में थोड़ा सा ट्रिम और अभी भी पेपर दोनों तरफ से अंतरिक्ष है। मेरी रसीद की कमी कागज में केंद्र है। तो कृपया मेरी मदद करें @ डेविड एच –

संबंधित मुद्दे