Module: MotionPrime::NanoBagMixin

Includes:
FilterMixin
Included in:
NSFNanoBag
Defined in:
motion-prime/models/_nano_bag_mixin.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from FilterMixin

#filter_array

Class Method Details

.included(base) ⇒ Object



6
7
8
9
10
11
12
13
14
15
# File 'motion-prime/models/_nano_bag_mixin.rb', line 6

def self.included(base)
  base.class_eval do
    alias_method :saved, :savedObjects
    alias_method :unsaved, :unsavedObjects
    alias_method :removed, :removedObjects
    alias_method :size, :count
    alias_method :inflate, :inflateBag
    alias_method :deflate, :deflateBag
  end
end

Instance Method Details

#add(object_or_array, options = {}) ⇒ Object Also known as: +, <<

Add an object or array of objects to bag

Raises:



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'motion-prime/models/_nano_bag_mixin.rb', line 35

def add(object_or_array, options = {})
  error_ptr = Pointer.new(:id)
  options[:existed_ids] ||= filter_array(self.to_a, bag_key: self.key).inject({}) do |result, item|
    result.merge(item.id => item)
  end
  prepared = prepare_for_store(object_or_array, options)

  if object_or_array.is_a?(Array)
    self.addObjectsFromArray(prepared, error:error_ptr)
  else
    self.addObject(prepared, error:error_ptr)
  end
  raise StoreError, error_ptr[0].description if error_ptr[0]
  self
end

#changed?Boolean

Returns:

  • (Boolean)


21
22
23
# File 'motion-prime/models/_nano_bag_mixin.rb', line 21

def changed?
  self.hasUnsavedChanges
end

#delete(object_or_array) ⇒ Object Also known as: -

Remove an object or array of objects from bag

Parameters:

  • items (Array<Prime::Model>, Prime::Model)

    model or array of models to remove

Returns:

  • self

Raises:



91
92
93
94
95
96
97
98
99
100
# File 'motion-prime/models/_nano_bag_mixin.rb', line 91

def delete(object_or_array)
  error_ptr = Pointer.new(:id)
  if object_or_array.is_a?(Array)
    self.removeObjectsInArray(object_or_array, error: error_ptr)
  else
    self.removeObject(object_or_array, error_ptr)
  end
  raise StoreError, error_ptr[0].description if error_ptr[0]
  self
end

#delete_allObject Also known as: clear

Clear content of the bag

Returns:

  • self



106
107
108
109
110
111
112
113
# File 'motion-prime/models/_nano_bag_mixin.rb', line 106

def delete_all
  bag_copy = to_a.clone
  # this removes childrens from model
  delete(self.to_a)
  # this removes collection from db
  bag_copy.each(&:delete)
  self
end

#delete_key(key) ⇒ Object

Remove object from bag with key

Parameters:

  • key (String)

    a key or array of keys



78
79
80
81
82
83
84
85
# File 'motion-prime/models/_nano_bag_mixin.rb', line 78

def delete_key(key)
  if key.is_a?(Array)
    self.removeObjectsWithKeysInArray(key)
  else
    self.removeObjectWithKey(key)
  end
  self
end

#originalClassStringObject



17
18
19
# File 'motion-prime/models/_nano_bag_mixin.rb', line 17

def originalClassString
  'NSFNanoBag'
end

#prepare_for_store(object, options = {}) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'motion-prime/models/_nano_bag_mixin.rb', line 53

def prepare_for_store(object, options = {})
  if object.is_a?(Array)
    object.map { |entity| prepare_for_store(entity, options) }.compact
  else
    object.bag_key = self.key
    if object.id.present? && options[:existed_ids].include?(object.id)
      if options[:silent_validation]
        return
      elsif options[:replace]
        replace = options[:existed_ids][object.id]
        replace.delete
        delete_key(replace.key)
        object
      else
        raise StoreError, "duplicated item added `#{object.class_name_without_kvo}` with `id` = #{object.id}"
      end
    end
    object
  end
end

#reloadObject

Raises:



140
141
142
143
144
145
# File 'motion-prime/models/_nano_bag_mixin.rb', line 140

def reload
  error_ptr = Pointer.new(:id)
  result = self.reloadBagWithError(error_ptr)
  raise StoreError, error_ptr[0].description if error_ptr[0]
  result
end

#saveObject



128
129
130
# File 'motion-prime/models/_nano_bag_mixin.rb', line 128

def save
  self.performSelectorOnMainThread :save!, withObject: nil, waitUntilDone: true
end

#save!Object

Raises:



132
133
134
135
136
137
138
# File 'motion-prime/models/_nano_bag_mixin.rb', line 132

def save!
  self.store ||= MotionPrime::Store.shared_store
  error_ptr = Pointer.new(:id)
  result = self.saveAndReturnError(error_ptr)
  raise StoreError, error_ptr[0].description if error_ptr[0]
  result
end

#store=(store, retry_count = 0) ⇒ Object



117
118
119
120
121
122
123
124
125
126
# File 'motion-prime/models/_nano_bag_mixin.rb', line 117

def store=(store, retry_count = 0)
  store.addObject(self, error: nil)
rescue Exception => e
  sleep(0.1)
  if retry_count == 3
    raise StoreError, e.description
  else
    send(:store=, store, retry_count + 1)
  end
end

#to_aObject

Return all objects in bag

Returns:

  • Array



28
29
30
# File 'motion-prime/models/_nano_bag_mixin.rb', line 28

def to_a
  self.savedObjects.values + self.unsavedObjects.values
end

#undoObject

Raises:



147
148
149
150
151
152
# File 'motion-prime/models/_nano_bag_mixin.rb', line 147

def undo
  error_ptr = Pointer.new(:id)
  result = self.undoChangesWithError(error_ptr)
  raise StoreError, error_ptr[0].description if error_ptr[0]
  result
end