0

RubyMotionを使用しており、 CKCalendarViewを使用してカレンダーを実装しています。次のコードで、イベントが発生する日を強調表示しています。

次のメソッドはから呼び出されますlayoutSubviews

def calendarDidLayoutSubviews(calendar)
  _events_array = []
  if self.events
    self.events.reverse.each do |ev|
      mdy = ev.date.month_date_year
      _events_array <<  mdy unless _events_array.include?(mdy)
    end
  end

  Dispatch::Queue.main.async do
    today = NSDate.date.month_date_year

    if calendar.dateButtons && calendar.dateButtons.length > 0
      calendar.dateButtons.each do |db|
        db.backgroundColor = "f4f2ee".to_color
        if db.date && db.date >= calendar.minimumDate && db.date <= calendar.maximumDate
          if _events_array && _events_array.length > 0
            db.setTitleColor("c7c3bb".to_color, forState:UIControlStateNormal)
            db.backgroundColor = "f4f2ee".to_color
            if _events_array.include?(db.date.month_date_year)
              db.setTitleColor(UIColor.blackColor, forState:UIControlStateNormal)
              db.backgroundColor = "9ebf6c".to_color
              _events_array.delete(db.date.month_date_year)
            end
          end
        end
        if db.date && db.date.month_date_year == today
          if calendar.minimumDate <= db.date && calendar.maximumDate >= db.date
            db.setTitleColor(UIColor.blackColor, forState:UIControlStateNormal)
          else
            db.setTitleColor("f4f2ee".to_color, forState:UIControlStateNormal)
          end
        end
      end
    end
  end
end

現状では、これにより、描画時にUIが0.5〜1.5秒間フリーズします。バックグラウンドスレッドに移動すると、描画に4〜5倍の時間がかかりますが、UIがフリーズしません。

質問:背景スレッドに高い優先度を与える方法、または描画にかかる半ダース秒で何も起こっていないように見えないように、dateButtonsを段階的に描画して強調表示する方法はありますか?メインスレッド)?

4

1 に答える 1

0

私が投稿したメソッドはメインスレッドで呼び出されていたので、バックグラウンドスレッドで呼び出されるように切り替えてから、ループ内のすべての描画操作でメインスレッドを呼び出しました。

def calendarDidLayoutSubviews(calendar)
   _events_array = []
  if self.events
    self.events.reverse.each do |ev|
      mdy = ev.date.month_date_year
      _events_array <<  mdy unless _events_array.include?(mdy)
    end
  end

  today = NSDate.date.month_date_year

  if calendar.dateButtons && calendar.dateButtons.length > 0
    calendar.dateButtons.each do |db|
      Dispatch::Queue.main.async do
        db.backgroundColor = "f4f2ee".to_color
      end
      if db.date && db.date >= calendar.minimumDate && db.date <= calendar.maximumDate
        if _events_array && _events_array.length > 0
          Dispatch::Queue.main.async do
            db.setTitleColor("c7c3bb".to_color, forState:UIControlStateNormal)
            db.backgroundColor = "f4f2ee".to_color
          end
          if _events_array.include?(db.date.month_date_year)
            Dispatch::Queue.main.async do
              db.setTitleColor(UIColor.blackColor, forState:UIControlStateNormal)
              db.backgroundColor = "9ebf6c".to_color
            end
            _events_array.delete(db.date.month_date_year)
          end
        end
      end
      if db.date && db.date.month_date_year == today
        if calendar.minimumDate <= db.date && calendar.maximumDate >= db.date
          Dispatch::Queue.main.async do
            db.setTitleColor(UIColor.blackColor, forState:UIControlStateNormal)
          end
        else
          Dispatch::Queue.main.async do
            db.setTitleColor("f4f2ee".to_color, forState:UIControlStateNormal)
          end
        end
      end
    end
  end
end
于 2012-12-08T01:33:33.980 に答える