performSelectorOnMainThread wordt niet uitgevoerd

Als ik mijn haar hieruit zou scheuren, zouden alle gedachten of suggesties enorm op prijs worden gesteld.

Ik heb een object dat performSelectorOnMainThread: withObject: waitUntil Done: opneemt vanuit een onderliggende thread. Dit werkt prima 95% van de tijd. Af en toe sinds iOS bèta's en nu in de release, zal een apparaat weigeren om de performSelectorOnMainThread: withObject: waitUntilDone: op te roepen ... Geen foutmelding, het crasht niet, ik kan ' om een ​​apparaat in een staat te laten gaan waarin het "faalt", maar zodra het daar is, blijft het falen totdat ik ofwel de app verwijder of opnieuw installeer, of dwing hem te stoppen, pas dan zijn locatievoorzieningen aan en start het opnieuw, stel vervolgens de locatieservices opnieuw in op normaal ... herstarten van het apparaat lost het niet op. Opnieuw installeren zonder eerst te verwijderen lost het niet op. Het is heel vreemd ... ik weet dat het meestal werkt, omdat de meeste apparaten geen problemen hebben, maar sommige apparaten falen enigszins regelmatig (elke 3 of 4 dagen misschien). Ik weet dat het specifiek is dat performSelectorOnMainThread: withObject: waitUntilDone: niet roept wat het zou moeten doen, want ik heb nu een defect apparaat en ik heb een NSLog geplaatst in de methode die moet worden aangeroepen. Het functioneert prima, maar op het defecte apparaat, wanneer performSelectorOnMainThread: withObject: waitUntilDone: wordt gebruikt om die methode aan te roepen, laat NSLog zien dat het niet wordt uitgevoerd ...

Dit begon met iOS 5 bèta's en nogmaals, gebeurt er bij de release. Het gebeurt het vaakst op 2 van mijn apparaten, maar op geen van de andere 10 apparaten die ik persoonlijk heb getest. Ik ging ervan uit dat dit slechts mijn apparaat was door een hapering in de beta, maar het gebeurt op mijn gloednieuwe 4S die de bèta nooit heeft aangeraakt, en ook op de iPad 2 van een gebruiker (niet op mijn iPad 2).

Ik weet echt niet waar ik moet kijken. Ik vertel het om uit te voeren en dat gebeurt meestal op bijna elk apparaat, maar dezelfde regel krijgt geen antwoord en geen fouten etc. op sommige ...

5
@picciano hoe ben je hier omheen gekomen? Ik ervaar hetzelfde probleem en kan er niet achter komen wat ik moet doen om de impasse te verhelpen.
toegevoegd de auteur Duncan Groenewald, de bron
Gebruikt u CoreData toevallig? Ik had een soortgelijk probleem. Wat er echt gebeurde was een thread impasse om een ​​leesbewerking uit te voeren met CoreData terwijl de andere thread probeerde te schrijven.
toegevoegd de auteur picciano, de bron

2 antwoord

performSelectorOnMainThread: withObject: waitUntilDone kan soms onaardig zijn. Heeft u erover nagedacht om te proberen lib-verzending te gebruiken?

U kunt een blok maken en dit als volgt op de hoofdthread plaatsen:

dispatch_async(dispatch_get_main_queue(), ^{
    
});

This would have the same save affect as using performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

3
toegevoegd

De RunLoop van Thread heeft verschillende modi. Het is mogelijk dat gedurende de tijd dat u belt de hoofdthread wordt uitgevoerd in een andere modus dan de standaard (die wordt getarget door performSelectorOnMainThread: withObject: WaitUntilTone: .

Overweeg het gebruik van performSelectorOnMainThread: withObject: waitUntilDone: modes:
Zie documentatie van Apple .

Ook - GCD (libdispatch) is geweldig, maar het zal je niet beschermen tegen het zelf koken van een impasse: Overweeg het geval waar uw methode wordt uitgevoerd op de rode draad en u belt:

dispatch_sync(dispatch_get_main_queue(), ^{
    
});
0
toegevoegd