/ / OK, за да стартирате фонови нишки от други фонови нишки? (NSObj) - iphone, multithreading, какао, xcode, конкуренция

OK, за да стартирате фонови нишки от други фонови нишки? (NSObj) - iphone, multithreading, какао, xcode, конкуренция

Този въпрос е за онези от вас, които, за разлика от мен, наистина разберете многофункционални приложения за какао. Ето, накратко, ситуацията е:

Ситуация:
Приложението ми постига съвкупност, като използва методите, предоставени в NSObject. Моля, кажете ми дали е добре да направите следното:

1) Главният контролер на изгледа ми стартира работа във фонов режим, за да освободи потребителския интерфейс:

[self performSelectorInBackground:@selector(loadImages:) withObject:nil];

2) Работата на заден план разделя задачата си на няколко по-малки задачи върху повече фонови нишки, така че всяка задача да се актуализира при завършването й (за разлика от приключването на всички задачи):

[self performSelectorInBackground:@selector(loadOneImage:) withObject:nil];

Обосновка:
Това беше единственият начин, по който бих могъл да измислям индивидуални задачи (зареждане / рисуване на потребителски UIViews) в набор, за да се актуализира в UI AS, всеки от тях е завършен. В противен случай всички задачи се актуализират само когато приключи последната задача в групата ...

Отговори:

3 за отговор № 1

да, може да използвате performSelectorInBackground:... повиквания на вторични нишки от вторични нишки.

ако имате много теми за размножаване (по този начин), помислете за едно NSOperationQueue, В противен случай може да се окажете с тон фонови нишки. 100 нишки (например), всяко зареждане на едно изображение в мобилно устройство не е добро използване на ресурсите - нито пък ще реагира. NSOperationQueue ви позволява да ограничите максималния брой нишки / работници и да използвате повторно работните нишки.

Забележка: "100 нишки" беше използвана, защото броят е далеч извън логиката за хардуера (въпросът е маркиран с iPhone). ако зареждането на изображението е в паметта, просто използвайте сериен (1 работник наведнъж) NSOperationQueue - NSOperations може да определи приоритет. ако се изтеглят изображения, може да искате да се придържате към 4 или по-малко.

нещата са различни за OS X, където имаповече ядра и налични ресурси, така че тези номера ще се променят при промяна на хардуерната платформа. на OS X можете успешно да използвате 100 нишки в едно приложение, въпреки че е необичайно да имате нужда от нещо близо до толкова много теми за повечето приложения.


1 за отговор № 2

Няма нищо лошо в този подход, доколкото мога да видя. Според доктора, performSelectorInBackground:withObject: просто пуска друга нишка и изпълнява своя селектор там. Той не съдържа никакви ограничения. Просто не забравяйте да създадете авторелейни пулове във всеки метод, който се обаждате чрез performSelectorInBackground:withObject: за да не изтече паметта.


1 за отговор № 3

Едно критично условие трябва да сте сигурни. И двете нишки, които се изпълняват във фонов режим, не трябва да имат никаква зависимост. Ако те имат, тогава може да се окажете в несъответствие.

Така че beter, ако отидете за операция опашки, вместо да хвърлят хайвера нишка от друга фонова нишка.