2016-07-11 9 views
0

Ich habe in den letzten Wochen aufgrund eines sehr merkwürdigen Verhaltens von ProMotion/RedPotion den Verstand verloren.ProMotion Lifecycle-Methoden laufen nicht in Betrieb

Ich habe das seltsame Verhalten auf eine scheinbar nicht ordnungsgemäße Ausführung der Lifecycle-Methoden von ProMotion und einen API-Aufruf eingegrenzt.

Ich habe einen Bildschirm, der Informationen von meiner API erhalten und ein Bild basierend auf der Bild-URL von der API zurückgegeben wird. Ich habe mein Projekt zu einem Bildschirm, einem Modell und einem Stylesheet zu stark vereinfacht wie folgt:

Testbild:

class TestScreen < PM::Screen 
    title "Your title here" 
    stylesheet TestScreenStylesheet 

    def on_load 
    mp "ran on_load" 
    @face_image = append!(UIImageView, :face_image) 
    mp "getting data from API" 
    Face.get(1) do |response, face| 
     if response.success? 
     mp "face returned from API:" 
     mp face.inspect 
     @face = face 
     else 
     @face = [{attributes: {name: "No faces found"}}] 
     end 
    end 
    mp "should have printed data obtained from API" 
    end 

    def will_appear 
    mp "ran on_will_appear" 
    mp "face in will_appear:" 
    if @face 
     rmq(:face_image).attr(remote_image: @face.picture) 
    else 
     mp "@face is nil!!!" 
    end 
    end 

end 

Sheet:

class TestScreenStylesheet < ApplicationStylesheet 

    def setup 
    end 

    def root_view(st) 
    st.background_color = color.white 
    end 

    def face_image(st) 
    st.frame = {l: 30, t: 140, w: 250, h: 250} 
    st.placeholder_image = image.resource("placeholder_image.png") 
    end 
end 

Modell:

class Face 
    attr_accessor :id, :name, :description, :local_description, :picture, :bio_picture, :star_ranking, :status, :facetype_id, :answers 

    def initialize(response) 
    @id = response[:data][0][:id] 
    @name = response[:data][0][:attributes][:name] 
    @description = response[:data][0][:attributes][:description] 
    @local_description = response[:data][0][:attributes][:local_description] 
    @picture = response[:data][0][:attributes][:picture] 
    @bio_picture = response[:data][0][:attributes][:bio_picture] 
    @star_ranking = response[:data][0][:attributes][:star_ranking] 
    @status = response[:data][0][:attributes][:status] 
    @facetype_id = response[:data][0][:attributes][:facetype_id] 
    @answers = response[:data][0][:attributes][:answers] 

    end 

    def self.get(category_id,&callback) 
    ApiClient.client.get "random_face?mycategory=#{category_id}" do |response| 
     model = nil 
     if response.success? 
     model = self.new(response.object) 
     end 
     callback.call(response, model) 
    end 
    end 

end 

Ich habe Englisch: www.doc-o-matic.com/webhelp/Tdlg.html Ausgelagerte Ausdruckbefehle (mp), damit ich herausfinden kann, was wann ausgeführt wird, und wie Sie in der unter Ergebnisse, alles ist, um aus:

"ran on_load" 
"getting data from API" 
"should have printed data obtained from API" 
"ran on_will_appear" 
"face in will_appear:" 
"@face is nil!!!" 
"face returned from API:" 
"#<Face:0x113c37c90 @id=\"1\" @name=\"Leonel Messi\" @description=\"Leonel Messi es un jugador portugués de fútbol, 4 veces ganador del Balón de Oro\" @local_description=\"translation missing: en.Leonel Messi_description\" @picture=\"default_url\" @bio_picture=\"default_url\" @star_ranking=1 @status=\"active\" @facetype_id=nil @answers=\"[\\\"Kun Aguero\\\", \\\"Nicolas Shevchenko\\\", \\\"Leonel Messi\\\", \\\"Clarence Seedorf\\\"]\">" 

Die on_load Verfahren Brände Zuerst wird, wie erwartet, aber die API-Aufruf, direkt in der Mitte der on_load Methode, Brände letzten. Daher ist das Bildattribut, das ich in der Methode view_did_load einstellen möchte, null und schlägt fehl.

Ich komme aus einem Rails-Hintergrund und ich bin neu in RubyMotion/ProMotion/RedPotion, damit ich vielleicht alles falsch mache, aber es scheint hier sicherlich etwas sehr falsch zu sein.

Antwort

0

Wie andrewhavens zeigte hier aus:

https://github.com/infinitered/redpotion/issues/164

der Grund, dies geschieht, ist, dass mein API-Aufruf asynchron ist, so dass es nicht zu Ende wird die Ausführung und stellen Sie das Instanz-Variable in der Zeit für die will_appear Methode zu verwenden, es (es wird immer noch zu der Zeit nil_willar läuft).

Um die Attribute richtig einzustellen, müssen sie nach dem Aufruf API eingestellt werden abgeschlossen ist, zum Beispiel in der Callback selbst wie folgt aus:

... 

if response.success? 
    mp "face returned from API:" 
    mp face.inspect 
    @face = face 
    rmq(:face_image).attr(remote_image: @face.picture) 
else 

... 

dann wird es gut funktionieren.

Hoffe das spart jemand Stunden der Fehlersuche.