package com.mathiasluo.designer.model;
import com.mathiasluo.designer.bean.Shot;
import com.mathiasluo.designer.bean.Team;
import com.mathiasluo.designer.model.IModel.ShotModel;
import com.mathiasluo.designer.model.service.ServiceAPI;
import com.mathiasluo.designer.model.service.ServiceAPIModel;
import com.mathiasluo.designer.utils.LogUtils;
import java.util.ArrayList;
import java.util.List;
import io.realm.Realm;
import io.realm.RealmResults;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
/**
* Created by MathiasLuo on 2016/3/1.
*/
public class ShotModelImpl implements ShotModel {
private Realm mRealm;
private static ShotModelImpl instance;
private static ServiceAPI mServiceAPI;
public final static int PAGE = 1;
public final static int PER_PAGE = 10;
public final static ShotModelImpl getInstance() {
if (instance == null) {
synchronized (ShotModelImpl.class) {
if (instance == null)
instance = new ShotModelImpl();
}
}
return instance;
}
private ShotModelImpl() {
mServiceAPI = ServiceAPIModel.provideServiceAPI(ServiceAPIModel.provideOkHttpClient());
}
@Override
public Observable<List<Shot>> getShotsFromServer(int page, int per_page) {
return mServiceAPI.getShots(page, per_page)
.map(new Func1<Shot[], List<Shot>>() {
@Override
public List<Shot> call(Shot[] shots) {
List<Shot> shotList = new ArrayList<>();
for (int i = 0; i < shots.length; i++) {
Shot val = shots[i];
if (val.getTeam() == null)
val.setTeam(new Team(new Integer(12345)));
shotList.add(val);
}
return shotList;
}
});
}
@Override
public void saveShotsToRealm(List<Shot> shots) {
mRealm = Realm.getDefaultInstance();
mRealm.beginTransaction();
mRealm.copyToRealmOrUpdate(shots);
mRealm.commitTransaction();
mRealm.close();
LogUtils.d("保存了新来的Shot");
}
@Override
public void clearShotsToRealm() {
mRealm = Realm.getDefaultInstance();
mRealm.beginTransaction();
mRealm.clear(Shot.class);
mRealm.commitTransaction();
mRealm.close();
LogUtils.d("清除了所有Shot");
}
@Override
public void closeSomeThing() {
mRealm.close();
}
@Override
public Observable<List<Shot>> loadShots() {
mRealm = Realm.getDefaultInstance();
Observable observable = mRealm.where(Shot.class)
.findAllAsync()
.asObservable()
.observeOn(AndroidSchedulers.mainThread())
.filter(new Func1<RealmResults<Shot>, Boolean>() {
@Override
public Boolean call(RealmResults<Shot> shots) {
return shots.isLoaded();
}
})
.map(new Func1<RealmResults<Shot>, List<Shot>>() {
@Override
public List<Shot> call(RealmResults<Shot> shots) {
ArrayList<Shot> LIST = new ArrayList<Shot>();
for (Shot shot : shots) LIST.add(shot);
return LIST;
}
});
return observable;
}
}