Referências Técnicas
Documentação técnica aprofundada sobre implementação, performance e decisões de arquitetura.
📚 Documentos Disponíveis
🔄 Fluxo de Dados
Como os dados fluem através da aplicação, diagramas de sequência e ciclos de vida.
Ver documentação →⚡ Performance
Otimizações aplicadas, benchmarks e best practices para manter a app performática.
Ver documentação →🎯 Escolhas Técnicas
Decisões de arquitetura, trade-offs e justificativas técnicas.
Ver documentação →🎓 Tópicos Avançados
AVFoundation
- Configuração de Session - Setup completo do AVCaptureSession
- Seleção de Formatos - Algoritmo de escolha de formato
- Threading Model - Como gerenciar threads corretamente
SwiftUI + UIKit
- UIViewRepresentable Bridges - Integração SwiftUI-UIKit
- Coordinator Pattern - Sincronização bidirecional
- Gesture Handling - Gestos em preview layers
Core Image
- Filtros de Vídeo - Pipeline de aplicação de filtros
- AVVideoComposition - Processamento frame-by-frame
- Performance de Filtros - Otimizações de GPU
🧵 Threading Deep Dive
Queues Utilizadas
Queue | Label | Tipo | Uso |
---|---|---|---|
Main | com.apple.main-thread |
Serial | UI updates, @Published |
Session | camera.session.queue |
Serial | AVFoundation config |
UserInitiated | .userInitiated |
Concurrent | Thumbnails |
Utility | .utility |
Concurrent | Video export |
Sincronização
// ViewModel → Controller (async)
controller.setZoomFactor(2.0, animated: true)
// Controller → ViewModel (main thread callback)
DispatchQueue.main.async {
self.isSessionRunning = true
}
// Heavy work → Main thread
DispatchQueue.global(qos: .userInitiated).async {
let thumbnail = generateThumbnail()
DispatchQueue.main.async {
self.segments.append(segment)
}
}
📊 Performance Metrics
Configuração Inicial
Operação | Tempo Típico | Thread |
---|---|---|
Request Permissions | ~100ms | Main |
Configure Session | ~300ms | sessionQueue |
Start Session | ~200ms | sessionQueue |
Total | ~600ms | Mixed |
Gravação
Operação | Tempo | Thread |
---|---|---|
Start Recording | ~50ms | sessionQueue |
Stop Recording | ~100ms | sessionQueue |
Generate Thumbnail | ~150ms | Background |
Append to UI | ~10ms | Main |
Export
Operação | Tempo (30s vídeo) | Thread |
---|---|---|
Create Composition | ~50ms | Main |
Export (sem filtro) | ~5s | Background |
Export (com filtro) | ~15s | Background |
Save to Photos | ~500ms | Main |
🔧 Extensibilidade
Adicionar Novo Filtro
// 1. Adicionar case no enum
enum VideoFilter: String, CaseIterable {
case none
case mono
case sepia // ← Novo
}
// 2. Implementar no applyFilter
switch filterType {
case .sepia:
let filter = CIFilter.sepiaTone()
filter.intensity = 0.8
filter.inputImage = src
output = filter.outputImage
// ...
}
Adicionar Nova Feature de Câmera
// 1. Propriedade no ViewModel
@Published var isGridEnabled: Bool = false
// 2. Método de controle
func toggleGrid() {
isGridEnabled.toggle()
}
// 3. UI na ContentView
if model.isGridEnabled {
GridOverlay()
}
📈 Benchmarking
Como Medir Performance
import os.signpost
let log = OSLog(subsystem: "com.pedro.Camera", category: "Performance")
// Iniciar medição
let signpostID = OSSignpostID(log: log)
os_signpost(.begin, log: log, name: "VideoExport", signpostID: signpostID)
// Operação...
exporter.exportAsynchronously { ... }
// Terminar medição
os_signpost(.end, log: log, name: "VideoExport", signpostID: signpostID)
Ver resultados: Instruments → Points of Interest
🏗️ Padrões Arquiteturais
MVVM
Vantagens:
- Separação clara View/Logic
- Testável sem UI
- Reativo com Combine
Trade-offs:
- Boilerplate para bindings
- Learning curve
Delegation
Quando usar:
- Callbacks de APIs síncronas
- 1:1 relationships
- Protocol-oriented design
Alternativa: Closures para callbacks simples
Coordinator Pattern
Quando usar:
- Bridge UIKit ↔ SwiftUI
- Delegate complexo
- State sincronization
🔍 Debugging Tips
AVFoundation Issues
// Print todos os formatos disponíveis
for format in device.formats {
print("Format: \(format)")
print("FPS ranges: \(format.videoSupportedFrameRateRanges)")
}
// Print configuração atual
print("Active format: \(device.activeFormat)")
print("Active frame rate: \(device.activeVideoMaxFrameDuration)")
print("Zoom factor: \(device.videoZoomFactor)")
Threading Issues
// Assert main thread
dispatchPrecondition(condition: .onQueue(.main))
// Assert background thread
dispatchPrecondition(condition: .notOnQueue(.main))
// Print current thread
print("Thread: \(Thread.current)")
Memory Leaks
// Use weak self em closures
controller.configureSession { [weak self] error in
guard let self = self else { return }
// ...
}
// Instruments → Leaks para detectar
📚 Recursos Adicionais
Apple Documentation
WWDC Sessions
- WWDC 2023: What’s new in Camera Capture
- WWDC 2021: Discover ARKit 5
- WWDC 2020: Edit and play back HDR video with AVFoundation
← Guias | Fluxo de Dados → |