Този въпрос е за онези от вас, които, за разлика от мен, наистина разберете многофункционални приложения за какао. Ето, накратко, ситуацията е:
Ситуация:
Приложението ми постига съвкупност, като използва методите, предоставени в 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, ако отидете за операция опашки, вместо да хвърлят хайвера нишка от друга фонова нишка.