performSelectorOnMainThread не выконвае

Раздзіраючы мае валасы на гэта, любыя думкі ці прапановы будуць высока ацэнены.

У мяне ёсць аб'ект, які выклікае performSelectorOnMainThread: withObject: waitUntilDone: на сябе ад даччынага патоку. Гэта выдатна працуе 95% часу. Кожны раз у той час, так як iOS бэты і цяпер у выпуску, прылада будзе адмовіцца ад выканання performSelectorOnMainThread: withObject: waitUntilDone: не называе ... Паведамленне пра памылку, ён не адмовіць, я магу » т зрабіць прылада пяройдзе ў стан, у якім ён «не можа», але як толькі ён там працягвае трываць няўдачу, пакуль не выдаліце ​​і паўторна ўсталяваць прыкладанне, або прымусіць яго кінуць, а затым наладзіць яго прыпуск месца службы, а затым запусціць яго зноў, затым паўторна наладзіць яго месцазнаходжанне і паслугі зноў вярнуцца да нармальнага жыцця ... перазагрузкі прылады не выправіць. Паўторная ўстаноўка без выдалення першага не выправіць. Гэта вельмі дзіўна .... Я ведаю, што гэта працуе вялікую частку часу, таму што большасць прылад не маюць ніякіх праблем, аднак некаторыя прылады не ў стане некалькі рэгулярна (кожныя 3 ці 4 дні, можа быць). Я ведаю, што гэта спецыяльна, што performSelectorOnMainThread: withObject: waitUntilDone: не называе тое, што павінна, таму што я атрымаў нездавальняючы прылада цяпер, і я паставіў NSLog ў метад, які павінен быць выкліканы. Ён функцыянуе нармальна, але на няспраўным прыладзе, калі performSelectorOnMainThread: withObject: waitUntilDone: выкарыстоўваецца для выкліку, што метад NSLog паказвае, што гэта не бежится ...

Гэта пачатак адбывацца з iOS 5 бэт і зноў адбываецца на выпуску. Гэта адбываецца часцей за ўсё на 2 маіх прыладах, але ні па адным з 10 іншых прылад я асабіста праверыў на. Я выказаў меркаванне, што гэта было толькі маё прылада з некаторага ікаўка ў бэта-версіі, але гэта адбываецца на маёй новенькіх 4S, які ніколі не кранулі бэта, а таксама на аднаго карыстальніка IPad 2 (не на маім IPad 2).

Я сапраўды не ведаю, дзе шукаць. Я кажу гэта, каб выканаць і гэта звычайна робіць практычна ўсе прылады, але тая ж лінія не атрымлівае адказу і ніякіх памылак і г.д. на некаторых ...

5
@picciano як вы гэта абысці? Я адчуваю такое ж пытанне і не магу зразумець, што мне трэба зрабіць, каб выправіць затор.
дададзена аўтар Duncan Groenewald, крыніца
Вы карыстаецеся CoreData выпадкова? У мяне была аналагічная праблема. Што адбываецца на самай справе была нітка тупік чакае, каб выканаць аперацыю чытання з дапамогай CoreData у той час як іншы паток спрабуе пісаць.
дададзена аўтар picciano, крыніца

2 адказы

performSelectorOnMainThread: withObject: waitUntilDone можа быць хісткім часам. Ці задумваліся Вы пра спробу выкарыстоўваць Lib адпраўку?

Вы можаце стварыць блок і размясціць яго ў асноўным струмені, як гэта:

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
дададзена

А ніткі RunLoop мае некалькі розных рэжымаў. Цалкам магчыма, што на працягу часу вы робіце ваш выклік асноўнага паток працуе ў рэжыме, выдатным ад зададзенага па змаўчанні (які з'яўляецца адзін мішэнню performSelectorOnMainThread: withObject: WaitUntilDone: .

Разгледзіце магчымасць выкарыстання performSelectorOnMainThread: withObject: waitUntilDone: рэжымы:
См дакументацыі кампаніі Apple .

Таксама - Нод (libdispatch) з'яўляецца дзіўным, але гэта не абароніць вас ад падрыхтоўкі ежы сябе ў тупік: Разгледзім выпадак, калі ваш метад працуе ў асноўным струмені, і вы тэлефануеце:

dispatch_sync(dispatch_get_main_queue(), ^{
    
});
0
дададзена