Unë jam duke krijuar një aplikacion iOS që ju lejon të kontrolloni në distancë muzikën në një aplikacion që luan në desktopin tuaj.
Një nga problemet më të vështira është aftësia për të përditësuar pozicionin e "gjurmuesit" (i cili tregon pozicionin kohor dhe kohëzgjatjen e këngës që luhet aktualisht). Këtu ka disa burime të dhënash:
- Në nisje, telekomanda dërgon një kërkesë rrjeti për të marrë pozicionin fillestar dhe kohëzgjatjen e këngës që luhet aktualisht.
- Kur përdoruesi rregullon pozicionin e gjurmuesit duke përdorur telekomandën, ai dërgon një kërkesë rrjeti te aplikacioni i muzikës për të ndryshuar pozicionin e këngës.
- Nëse përdoruesi përdor aplikacionin në desktop për të ndryshuar pozicionin e gjurmuesit, aplikacioni dërgon një kërkesë rrjeti në telekomandë me pozicionin e ri të gjurmuesit.
- Nëse kënga po luhet aktualisht, pozicioni i gjurmuesit përditësohet çdo 0,5 sekonda ose më shumë.
Për momentin, gjurmuesi është një UISlider i cili mbështetet nga një model "Player". Sa herë që përdoruesi ndryshon pozicionin në rrëshqitës, ai përditëson modelin dhe dërgon një kërkesë rrjeti, si kjo:
Në NowPlayingViewController.m
[[slider rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UISlider *x) {
[playerModel seekToPosition:x.value];
}];
[RACObserve(playerModel, position) subscribeNext:^(id x) {
slider.value = player.position;
}];
Në PlayerModel.m:
@property (nonatomic) NSTimeInterval position;
- (void)seekToPosition:(NSTimeInterval)position
{
self.position = position;
[self.client newRequestWithMethod:@"seekTo" params:@[positionArg] callback:NULL];
}
- (void)receivedPlayerUpdate:(NSDictionary *)json
{
self.position = [json objectForKey:@"position"]
}
Problemi është kur një përdorues "përplas" me rrëshqitësin dhe vendos në radhë një numër kërkesash rrjeti të cilat të gjitha kthehen në kohë të ndryshme. Përdoruesi mund të ketë lëvizur përsëri rrëshqitësin kur të merret një përgjigje, duke e zhvendosur rrëshqitësin përsëri në një vlerë të mëparshme.
Pyetja ime: Si ta përdor saktë ReactiveCocoa në këtë shembull, duke u siguruar që përditësimet nga rrjeti të trajtohen, por vetëm nëse përdoruesi nuk e ka lëvizur rrëshqitësin që atëherë?