如何在Rubymotion中等待调用初始化变量?

时间:2013-11-13 05:11:19

标签: ruby multithreading rubymotion

我们可以让一些进程等待变量初始化然后继续吗?

我有以下代码:

  def viewDidLoad
    BW::Location.get(distance_filter: 10, desired_accuracy: :best) do |result|
      if result[:error].nil?
        lat = result[:to].latitude
        lng = result[:to].longitude
      end
      BW::HTTP.get("APIURL" |response|
        case response.status_code
          when 200
          parsed_json = BW::JSON.parse(response.body)
          if parsed_json[:tags]
            App::Persistence['tag'] = parsed_json[:tags]
          else
            UIApplication.sharedApplication.delegate.logged_out
          end
        end
      end
    end    

    def imagePickerController(picker, didFinishPickingMediaWithInfo: info)
      begin
        App.alert('hello')
      end while App::Persistence['tag'].nil?
    end
    App.alert("Finish")
  end

拍摄照片时,我的App :: Persistence ['tag']可能尚未从API调用中收到值。因此,当用户单击“下一步”按钮时,我想让他们等待App :: Persistence ['tag']进行初始化,然后继续。

这似乎不起作用,它继续警告“完成”。

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是将采摘后/摄像机业务逻辑放入其自己的方法中,然后当图像选择器/摄像机完成时,如果标签准备就绪,则调用该业务逻辑方法,如果它尚未就绪,则设置KVO听取标签改变可能,并存储来自选择器/摄像机的信息,然后一旦KVO拿起标签准备就绪,它将调用您的业务逻辑方法(或调用您的业务逻辑方法的方法)

attr_accessor :cameraInfo

def doTheThing
  # your business logic, do something with self.cameraInfo
  self.cameraInfo = nil
end

def imagePickerController(picker, didFinishPickingMediaWithInfo: info)
  self.cameraInfo = info
  if App::Persistence['tag'].nil?
    # setup KVO or some basic loop in another thread or something along those lines
  else
    doTheThing
  end
end