Grand Central Dispatch (GCD) zapewnia prosty i niezawodny mechanizm współbieżnych i asynchronicznych operacji, głównie w systemach operacyjnych Apple (np. IOS, macOS, watchOS i tvOS), ale także we FreeBSD i MidnightBSD.
Czy istnieje sposób na wywołanie bloku z prymitywnym parametrem po opóźnieniu, np. Użycie, performSelector:withObject:afterDelay:ale z argumentem takim jak int/ double/ float?
Przeglądałem iBook od Apple i nie mogę znaleźć żadnej jego definicji: Czy ktoś może wyjaśnić strukturę dispatch_after? dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
Uczę się o programowaniu współbieżnym na iOS. Do tej pory czytałem o NSOperation/NSOperationQueue i GCD. Jakie są powody używania NSOperationQueueover GCDi vice versa? Brzmi jak oba GCDi NSOperationQueueoddziela jawne tworzenie NSThreadsod użytkownika. Jednak związek między tymi dwoma podejściami nie jest dla mnie jasny, więc wszelkie uwagi należy docenić!
W Swift 2 mogłem użyć dispatch_afterdo opóźnienia akcji za pomocą wielkiej centralnej wysyłki: var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { // your function here }) Ale wydaje się, że nie kompiluje się już od Swift 3. Jaki jest preferowany sposób pisania tego we współczesnym Swift?
W Swift 2 udało mi się utworzyć kolejkę z następującym kodem: let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) Ale nie kompiluje się w Swift 3. Jaki jest preferowany sposób napisania tego w Swift 3?
Jeśli możesz kierować system iOS 4.0 lub nowszy Czy używając GCD to najlepszy sposób na utworzenie singletonu w Objective-C (wątek bezpieczny)? + (instancetype)sharedInstance { static dispatch_once_t once; static id sharedInstance; dispatch_once(&once, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }
Mam wywołanie zwrotne, które może pochodzić z dowolnego wątku. Kiedy otrzymuję to wywołanie zwrotne, chciałbym wykonać pewne zadanie w głównym wątku. Czy muszę sprawdzać, czy jestem już w głównym wątku - czy istnieje kara za nieprzeprowadzenie tej kontroli przed wywołaniem poniższego kodu? dispatch_async(dispatch_get_main_queue(), ^{ // do work here });
Mam dużo kodu w projektach Swift 2.x (lub nawet 1.x), które wyglądają tak: // Move to a background thread to do some long running work dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { let image = self.loadOrGenerateAnImage() // Bounce back to the main thread to update the UI dispatch_async(dispatch_get_main_queue()) { self.imageView.image = image } } …
W mojej aplikacji mam funkcję, która tworzy NSRURLSession i wysyła NSURLRequest za pomocą sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) W bloku ukończenia tego zadania muszę wykonać obliczenia, które dodają obraz UIImagającego do wywołującego kontrolera widoku. Mam func o nazwie func displayQRCode(receiveAddr, withAmountInBTC:amountBTC) wykonuje obliczenia dodające UIImage. Jeśli spróbuję uruchomić kod dodający …
Korzystając z GCD, chcemy przejść do wykonania i wykonania dwóch bloków asynchronicznych, zanim przejdziemy do kolejnych kroków wykonania. Jak najlepiej to zrobić? Wypróbowaliśmy następujące, ale wydaje się, że to nie działa: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block1 }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block2 }); // wait until both the …
Testuję kod, który wykonuje przetwarzanie asynchroniczne przy użyciu Grand Central Dispatch. Kod testowy wygląda następująco: [object runSomeLongOperationAndDo:^{ STAssert… }]; Testy muszą czekać na zakończenie operacji. Moje obecne rozwiązanie wygląda następująco: __block BOOL finished = NO; [object runSomeLongOperationAndDo:^{ STAssert… finished = YES; }]; while (!finished); Co wygląda nieco prymitywnie, znasz lepszy …
Chciałbym, aby pętla for in wysyłała kilka żądań sieciowych do firebase, a następnie przekazywała dane do nowego kontrolera widoku po zakończeniu wykonywania metody. Oto mój kod: var datesArray = [String: AnyObject]() for key in locationsArray { let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)") ref.observeSingleEventOfType(.Value, withBlock: { snapshot in datesArray["\(key.0)"] = …
Z powodzeniem korzystałem z funkcji Grand Central Dispatch w moich aplikacjach, ale zastanawiałem się, jaka jest prawdziwa zaleta korzystania z czegoś takiego: dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff lub nawet dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff Chodzi mi o to, że w obu przypadkach odpalasz blok do wykonania w głównym wątku, dokładnie …
Utworzyłem kolejkę szeregową w ten sposób: dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL); Jaka jest różnica między dispatch_asyncnazywane tak dispatch_async(_serialQueue, ^{ /* TASK 1 */ }); dispatch_async(_serialQueue, ^{ /* TASK 2 */ }); I dispatch_syncdzwoniłeś w ten sposób w tej kolejce szeregowej? dispatch_sync(_serialQueue, ^{ /* TASK 1 */ }); dispatch_sync(_serialQueue, ^{ /* …
Staram się w pełni zrozumieć kolejki równoległe i szeregowe w GCD. Mam pewne problemy i mam nadzieję, że ktoś może mi odpowiedzieć jasno i na temat. Czytam, że kolejki szeregowe są tworzone i używane do wykonywania zadań jedna po drugiej. Jednak co się stanie, jeśli: Tworzę kolejkę szeregową Używam dispatch_async(w …
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.