2015-05-27 18 views
5

To zdarza się bardzo rzadko. Oto ostatnia linia ślad stosu:crash_group_leave crash w swift

0 libdispatch.dylib    0x0000000197a85a9c dispatch_group_leave + 48 

dispatch_group_leave nazywa się w pełnym zamknięciem który wywołał tak:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
       {() -> Void in 
        let query = HKStatisticsCollectionQuery(quantityType: quantityType, 
         quantitySamplePredicate: nil, 
         options: statisticOptions, 
         anchorDate: anchorDate, 
         intervalComponents: interval) 
        query.initialResultsHandler = { 

         complete() 

Więc wysyłki do wątku tła, uruchom HKStatisticsCollectionQuery i następnie wywołaj zamknięcie parametru funkcji o nazwie complete. Inside complete to miejsce, w którym wywołana jest grupa dispatch_group_leave i następuje awaria.

Wszelkie pomysły są najbardziej cenione! Dzięki!

Odpowiedz

12

Jeśli wywołanie dispatch_group_leave nie zostanie zrównoważone przez , może nastąpić awaria.

+0

Interesujące. Mam hasło przed wywołaniem pierwszego zamknięcia. hmmm. – jestro

+0

Myślę, że to było to. Niektóre liście zaczęto nazywać zbyt szybko. Przeniesiono wszystkie wejścia i powiadomienie, zanim można będzie wywołać liście. Dzięki! – jestro

+0

@mustafa jest sposób, aby zapobiec przypadkowi wywołania dispatch_group_leave więcej niż powinien? np. w przypadkach, w których nie jestem w stanie stwierdzić na pewno, że blok zakończenia - którego wywołano w nazwie dispatch_group_leave - nie będzie wywoływany więcej niż raz? – ofer2980