2013-09-26 15 views
14

Utilizziamo il lettore di codici a barre Zbar degli ultimi 2 anni. Con iOS 7 e Xcode 5, dopo aver scansionato 5 codici a barre, l'app sta raggiungendo il 100% della CPU per il dispositivo iOS 7 (posso vederlo in modalità debug Xcode) e l'app diventa meno reattiva. Non abbiamo mai avuto problemi con versioni precedenti di iOS, tutto ha funzionato bene.Zbar SDK e ios7/xcode 5 - L'app sta raggiungendo il 100% di utilizzo e memoria della cpu oltre 100 MB

Le cose sono cambiate in iOS 7 relative al lancio della telecamera e ZBar SDK non è aggiornato? Qualcun altro sta affrontando lo stesso problema con iOS 7?

+0

anche gli altri utenti zbar affrontano lo stesso problema. ecco il link - https://sourceforge.net/p/zbar/discussion/1072195/thread/df4c215a/#b4cc – RGRG

risposta

18

risolto facendo questo: nel viewdidload

readerqr = [ZBarReaderViewController new]; 
    readerqr.readerDelegate = self; 
    readerqr.showsHelpOnFail = NO; 

ZBarImageScanner *scanner = readerqr.scanner; 
[scanner setSymbology: 0 
       config: ZBAR_CFG_ENABLE 
        to: 0]; 
[scanner setSymbology: ZBAR_QRCODE 
       config: ZBAR_CFG_ENABLE 
        to: 1]; 

// you can use this to support the simulator 
if(TARGET_IPHONE_SIMULATOR) { 
    cameraSim = [[ZBarCameraSimulator alloc] 
       initWithViewController: self]; 
    cameraSim.readerView = readerView; 
} 

creare ZBarReaderViewController *readerqr; come una proprietà della vostra viewcontroller.

usarlo:

-(void) showqr:(id)sender 
{ 
    [self presentViewController:readerqr animated:YES completion:nil]; 
    return; 
} 

In questo modo funziona, nessuna perdita, nessun CPU al 100%

+0

questo funziona per me. Grazie. (significa che c'è una perdita nella libreria) –

+1

Devi mostrare la dichiarazione delle variabili Non ho idea di cosa sia una lettura. – Alioo

+0

@joaquin Come è apparso il codice prima di aver risolto il problema? Ho lo stesso problema ma non riesco a risolverlo implementando il tuo codice. –

7

Dopo aver visto lo stesso problema,

mi sono trasferito da

ZBarReaderViewController

a

ZBarReaderView

La parte deludente di questo, però, è che se si sta utilizzando funzioni come Overlay nel ZBarReaderViewController, si deve ricodificare come che tutte le opere e si deve implementare cose come avviare e arrestare lo scanner, manualmente.

Ma in sostanza, avete bisogno di qualcosa di simile nel IBAction:

ZBarReaderView *reader = [ZBarReaderView new]; 
[self.view addSubview:reader]; 

reader.readerDelegate = self; 
reader.tracksSymbols=YES; 

ZBarImageScanner *scanner = reader.scanner; 

reader.tag = 99999999; 

// la parte importante qui è quello di avviare la scansione

[reader start]; 

Inoltre, ricordarsi di cambiare il delegato nella vostra header to ZBarReaderViewDelegate

Inoltre, il "metodo" delegato che viene chiamato, almeno nel mio codice, è ora (rispetto a imagePickerController)

-(void) readerView: (ZBarReaderView*) view 
     didReadSymbols: (ZBarSymbolSet*) syms 
     fromImage: (UIImage*) img 
      { 

      for(ZBarSymbol *sym in syms) { 

      [view stop]; 

      [self closeCameraScanner]; 

    // I am also setting reader to NIL but I don't really know if this is necessary or not. 

      reader=nil; 
     } 


    } 


    -(void)closeCameraScanner{ 

     UIView * v = [self.view viewWithTag:99999999]; 
     if (nil != v) { 
      [v removeFromSuperview]; 
     } 

     [self.view endEditing:YES]; 

    } 

Quindi, questo è un modo veloce e sporco per farlo. Ho un po 'di codice aggiuntivo per creare manualmente l'overlay e per limitare la scansione, ma per quanto riguarda semplicemente farlo funzionare, questo è stato il trucco per me.

+0

reader.tag = 99999999; non funziona per me – Nirav

+0

Non compare nulla quando inserisco questo nella mia azione, ma stranamente il mio flash si accende? – Alioo

+0

Buona risposta! I miei problemi di memoria sono stati risolti senza nemmeno dover fare nulla di speciale per lo scanner. Ho appena usato ZBarReaderView e ZBarReaderViewDelegate invece di ZBarReaderViewController e ZBarReaderDelegate. Avvio di readerView in viewDidAppear e interromperlo in viewDidDisapper, che funziona per la mia particolare applicazione. – Eric

3

Ho risolto il problema ora con l'implementazione del Diff dalla sorgente. Se qualcuno di voi ne ha bisogno, è possibile scaricare l'SDK zBar compilato con il supporto per iOS7 qui.

Si può semplicemente sostituire il libzbar.a - questo dovrebbe funzionare. Ma ho caricato l'SDK completo come qualcuno potrebbe avere bisogno di troppo con le intestazioni ecc

http://nerdvision.net/app-development/ios/zbar-sdk

+0

Questo non funziona. Ho anche compilato il mio binario utilizzando il .diff [qui] (http://sourceforge.net/p/zbar/patches/36/) che presumo sia quello che hai fatto, ma non funziona anche –

+1

puoi per favore ricostruire la libreria e aggiungere la slice i386. Non funziona sul simulatore –

4

ho risolto il problema che Barry Mc G aveva.

Ho avuto gli stessi problemi anche dopo l'applicazione dello zBar SDK con iOS7 da http://nerdvision.net/app-development/ios/zbar-sdk. (5a-6a volta che si apre la pagina si blocca al 100% della CPU.)

Se si sottoclasse ZBarViewController o lo si utilizza direttamente, si presenta il controller della vista e lo si chiude in un secondo momento quando si è terminato lo scanner. Ho trovato il motivo per cui questo accade e il motivo è stato che non ho interrotto lo streaming video. In ZBarReaderView, c'è una funzione - (void) stop; e se si esegue questa funzione dopo aver finito con lo scanner, non si vedrà il problema (5a-6a volta che si apre la pagina si blocca al 100% della CPU.). Almeno nel mio caso ha funzionato e spero che funzioni anche per te.

+1

puoi ricostruire la libreria e aggiungere la slice i386. Non funziona sul simulatore –

0

Ero lo stesso problema e facilmente risolto. Non ricordo il codice sottostante. È necessario inserire questo codice quando si è fuori dalla vista del lettore.

[arresto lettura];

il problema di caricamento del cpu era causato dal flusso di telecamere duplicate.

0

avevano stessi problemi, scanner sembra essere gelata ..
ho riparato come Joaquin ...
Fai un immobile per il lettore e quando si chiama più volte è possibile controllare, se un oggetto del lettore dove inizializzare ...
Ecco cosa sto facendo:

- (IBAction)ShowZBarReader 
{ 
    // ADD: present a barcode reader that scans from the camera feed 
    if (!self.reader) { 
     self.reader = [[ZBarReaderViewController alloc]init]; 
    } 

    self.reader.readerDelegate = self; 
    self.reader.supportedOrientationsMask = ZBarOrientationMaskAll; 

    ZBarImageScanner *scanner = self.reader.scanner; 
    // zusätliche Configurationen ... 

    [scanner setSymbology: ZBAR_I25 
        config: ZBAR_CFG_ENABLE 
         to: 0]; 
    // stellt Bild zur verfügung 
    [self presentViewController:self.reader animated:YES completion:nil]; 
} 

ha funzionato perfettamente per me! Spero che aiuti :)

Problemi correlati