2012年10月14日日曜日

since_id決定アルゴリズム最終版

account,data source,post type,color themeがひと通りできてルンルンでデバッグしてたらjsonのおかわりがうまく動かないケースに遭遇。6月に、
since_idを確定できるのは、lastidがおかわりしたJSONの中に含まれ、且つlastidとJSONの最後のidが等しくない場合なので、それ以外のケースでは、
1.lastidよりおかわりしたJSONの最初のidが小さい場合
2.lastidよりおかわりしたJSONの最後のidが大きい場合
に切り分けて、1の場合はlastidとJSONの最初のidの差分をsince_idに+=し、2の場合は逆に-=して再度おかわりして確定できるまで繰り返していた。
などと書いていたが、そもそも2のケースは1での足し方がおかしい(足し過ぎ)から発生するのであって、任意の数値を引くんじゃなくて、一旦元に戻して足すべき差分を減らして(それでも2になれば減らし方を激しくする)再度「足す」のが正しい。2つのケースがあるんじゃなくて後者をエラー処理として考えてやればすっきりとまとまった。
if(!offsetflg){
if(lastid>topid){
difid=lastid-topid;since_id+=difid;
offsinceval=[NSString stringWithFormat:@"%lld",since_id];[self reqDB];
NSLog(@"short! sid:%lld/lad:%lld (brk:%d)\n%@",since_id,lastid,brk,[bd valueForKeyPath:post(@"id")]);
return;
}else if(lastid<=[[[bd valueForKeyPath:post(@"id")]lastObject]longLongValue]){
since_id-=difid;difid/=brk++;since_id+=difid;
offsinceval=[NSString stringWithFormat:@"%lld",since_id];[self reqDB];
NSLog(@"over! sid:%lld/lad:%lld (brk:%d)\n%@",since_id,lastid,brk,[bd valueForKeyPath:post(@"id")]);
return;
}else{
NSLog(@"ok");
brk=2;
for(id idnum in [bd valueForKeyPath:post(@"id")]){
if(lastid<=[idnum longLongValue]) skip++;
else break;
}
}
}
できた。あとはいよいよタイムラインか。
昨日は姫路でイベント。帰りに手打ち麺やす田@新大阪で塩と白飯。うまかった。

0 件のコメント:

コメントを投稿