Merge Fellas Unlimited Shake - Архитектурный шаблон для высокочастотных жестов на мобильном телефоне?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Merge Fellas Unlimited Shake - Архитектурный шаблон для высокочастотных жестов на мобильном телефоне?

Сообщение Anonymous »

Моя команда борется с критически важной функцией как на iOS, так и на Android, кодовом названии «Merge Fellas Unlimited Shake». Проблема заключается в том, чтобы это было по -настоящему «неограниченным» и отзывчивым. Мы собрали подробные технические характеристики и проблемы с производительностью в краткое изложение здесь:
https://modhello.com/merge-fellas/образное/> Я обновил вопрос с более конкретными деталями и псевдокодом на основе обратной связи. Я удалил внешнюю ссылку DOC и переместил всю соответствующую информацию в сообщение. Цель состоит в том, чтобы опыт почувствовал себя бесшовным, что позволило получить движение «неограниченного коктейля», когда новая карта появляется почти мгновенно с каждым встряхиванием. Profilecard объекты. На каждом коктейле нам нужно запустить умеренно сложную алгоритм фильтрации и оценки фильтрации и оценки, чтобы найти «лучшую» следующую карту, чтобы показать.

Код: Выделить всё

// Data structure for each profile card
struct ProfileCard {
let id: Int
let name: String
let attributes: [String]
let compatibilityScore: Double
}

// Array holding all potential profiles
var allProfiles: [ProfileCard] = // Assume this is populated with ~2000 items

// This function is called directly on the main thread every time the device is shaken
func onShakeGesture() {
// This is the expensive operation
// It filters and sorts the entire array on every shake
let bestMatch = findBestMatch(from: allProfiles, for: currentUser)

// This updates the UI, but it's delayed because findBestMatch blocks the thread
updateUI(with: bestMatch)
}

func findBestMatch(from profiles: [ProfileCard], for user: User) -> ProfileCard? {
// 1. Filter out profiles the user has already seen
let unseenProfiles = profiles.filter { !user.seenProfileIDs.contains($0.id) }

// 2. Run a "scoring" algorithm on the remaining profiles
// THIS IS THE BOTTLENECK. It can be slow.
let scoredProfiles = unseenProfiles.map { profile in
let score = calculateMatchScore(user, profile) // Imagine this is a complex function
return (profile, score)
}

// 3. Sort by the calculated score to find the best one
let sortedProfiles = scoredProfiles.sorted { $0.1 > $1.1 }

return sortedProfiles.first?.0
}
Что мы рассмотрели:
Очевидный первый шаг - переместить findbestmatch в фоновый поток. Тем не менее, мы боремся с спецификой взаимодействия «Неограниченный коктейль»: < /p>

отмена: < /strong>, если пользователь снова трястится, когда фоновая задача уже выполняется, предыдущая задача должна быть немедленно отменена, чтобы запустить новую. Как мы можем управлять этим эффективно, не создавая условий гонки? Если появится новое встряхивание, что мы показываем? Загрузочный спиннер? Мы скрываем старую карту? Мы хотим, чтобы это чувствовало мгновенное. Фоновая задача, что такое надежный и производительный паттерн в современной мобильной разработке (Swift Complourency/Combine или Kotlin Coroutines/Flow) для обработки этого? job.cancelandjoin () В рамках схватки). Является ли предварительный размер небольшой партии кандидатов в память жизнеспособным подходом?>

Подробнее здесь: https://stackoverflow.com/questions/796 ... cy-gesture
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»