2017-09-15 55 views
10

[Swift]Postój i obsługa zakończeń Swift @

Witam Próbuję lepiej zrozumieć "Zamknięcie" Swift.

Ale @escaping i Completion Handler są zbyt trudne do zrozumienia

Szukałem wielu księgowań oraz oficjalne dokumenty Swift, ale stil odczuwalne nie tyle

To jest przykład kodu z dokumentów urzędowych

var completionHandlers: [()->Void] = [] 

func someFunctionWithEscapingClosure(completionHandler: @escaping()->Void){ 
    completionHandlers.append(completionHandler) 
} 
func someFunctionWithNoneescapingClosure(closure:()->Void){ 
    closure() 
} 

class SomeClass{ 
    var x:Int = 10 
    func doSomething(){ 
     someFunctionWithEscapingClosure { 
      self.x = 100 
      //not excute yet 
     } 
     someFunctionWithNoneescapingClosure { 
      x = 200 
     } 
    } 
} 
let instance = SomeClass() 
instance.doSomething() 
print(instance.x) 

completionHandlers.first?() 
print(instance.x) 

Słyszałem, że istnieją dwa sposoby i powody używania @esacping

Pierwsze s torowania zamknięcie, drugie jest asynchroniczny cel operacyjny

I od teraz są moje pytania

Po pierwsze, jeśli doSomething wykonywania następnie someFunctionWithEscapingClosure będzie wykonanie z parametrem zamknięcia i zamknięcie zostanie zapisany w zmiennej globalnej tablicy.

myślę, że zamknięcie jest {self.x = 100}

Jak self w {100} = self.x że zapisanego w zmiennej globalnej completionHandlers może połączyć się instance że przedmiotem SomeClass?

Po drugie, rozumiem tak: someFunctionWithEscapingClosure.

Aby zapisać lokalną zmienną zamknięcia completionHandler do zmiennej globalnej "completionHandlers` używamy słowa kluczowego @escaping!

bez @escaping słów kluczowych someFunctionWithEscapingClosure powroty, zmienna lokalna completionHandler usunie z pamięci

@escaping jest utrzymać to zamknięcie w pamięci

Czy to prawda?

Wreszcie, po prostu zastanawiam się nad istnieniem tej gramatyki.

Może jest to bardzo prymitywny pytanie

jeśli chcemy jakiejś funkcji wykonującego po jakiejś konkretnej funkcji

dlaczego nie możemy po prostu zadzwonić po jakąś funkcję wywołania konkretnej funkcji

jakie są różnice między używaniem powyższego wzorca a korzystaniem z funkcji oddzwaniania zwrotnego

dziękuję za przeczytanie długich pytań i przepraszam za to, że nie jestem tubylcem

Odpowiedz

14

Przede wszystkim chcę powiedzieć, „bardzo dobre pytanie :)”

Zakończenie Handler:

zakładają użytkownik aktualizuje aplikację podczas jej używania.Zdecydowanie chcesz powiadomić użytkownika, kiedy to się skończy. Możliwe, że pojawi się okienko z napisem: "Gratulacje, teraz możesz w pełni cieszyć się!"

Jak więc uruchomić blok kodu dopiero po zakończeniu pobierania? Co więcej, w jaki sposób animujesz określone obiekty tylko po przeniesieniu kontrolera widoku do następnego? Cóż, zamierzamy dowiedzieć się, jak zaprojektować takiego, jak szef. podstawie mojego ekspansywnej listy słownictwa, Ładowarki zakończenia oznaczają

Do stuff when things have been done

Dla więcej informacji, prosimy odwiedzić this blog post.

Łącze to daje mi pełną jasność o procedurach obsługi zakończeń (z punktu widzenia programisty dokładnie określa to, co musimy zrozumieć).

@escaping zamknięcia:

Po minięciu zamknięcie w argumentach funkcji, wykorzystując go po ciało funkcyjnego zostanie wykonany i wraca z powrotem kompilator. Kiedy funkcja się kończy, zakres przekazanego zamknięcia istnieje i istnieje w pamięci, dopóki zamknięcie nie zostanie wykonane.

Istnieje kilka sposobów na ucieczkę zamknięcie w zawierającego funkcję:

  • Przechowywanie: Kiedy trzeba przechowywać zamknięcie w zmiennej globalnej, mienia lub innego przechowywania, które istnieją w przeszłości pamięć o Wywołanie funkcji get get i zwróć kompilator z powrotem.

  • Wykonanie asynchroniczne: podczas wykonywania zamknięcia asynchronicznie w kolejce wysyłki, kolejka będzie przechowywać zamknięcie w pamięci dla ciebie, może być używana w przyszłości. W takim przypadku nie masz pojęcia, kiedy zamknięcie zostanie wykonane.

Przy próbie użycia zamknięcie w tych scenariuszach Swift kompilator pokaże błąd:

error screenshot

Dla większej jasności na ten temat można sprawdzić this post on Medium.

Mam nadzieję, że uzyskasz dobre zrozumienie z tego linku.

Jeśli nadal masz jakieś pytania (ale pamiętaj, aby przeczytać ten link wiersz po linii, jest to bardzo dobrze wytłumaczone), podziel się swoim komentarzem.

Dzięki

+0

linki były bardzo pomocne –

+0

Dzięki, cieszyć się kodowania w Swift –