我正在为多个平台做一个项目,我遵循最佳实践并创建了一个核心项目,以包含所有平台上相同的所有代码.为了进行网络通信,我想使用HttpClient,这似乎是推荐的与Web服务进行通信的方法.
我不是在做一个PCL,而只是一个包含核心项目的标准C#库.但是,似乎没有HttpClient的常见实现,只有平台特定的实现.我无法在我的核心中引用和使用它,但仅限于我的Android和iOS项目.
我非常希望在我的核心项目中拥有所有网络代码,因为我看到它有两个选项 - 我都不喜欢它们.
什么是推荐的方法,为什么Xamarin没有将HttpClient作为公共库提供?
希望有人可以帮忙,谢谢
我查看了WWDC 2010中的一些演示文稿,并阅读了大部分有关块和并发性的文档,并且在Grand Central Dispatch中使用带有串行队列的块有几个问题.我有一个iOS 4项目,它有一个scrollview和一个图像信息字典 - 图像的URL等等.我想使用GCD和块来下载图像并将它们放在我的scrollview中,从而不会阻塞主线程.我写了下面似乎有用的代码:
for (NSDictionary* dict in images)
{
dispatch_async(image_queue, ^{
NSString* urlString = [dict objectForKey:@"url"];
NSURL* url = [NSURL URLWithString:urlString];
NSData* imageData = [[NSData alloc] initWithContentsOfURL:url];
UIImage* image = [UIImage imageWithData:imageData];
UIImageView* imageView = // initialize imageView with image;
dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView addSubview:imageView];
});
[imageData release];
});
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
根据并发指南,我不应该从非标量类型的封闭范围中捕获变量 - 在我的代码中我捕获了dict,它是一个NSDictionary*对象.如果我不被允许捕获它,我该如何编写代码呢?块只捕获实际使用的封闭范围中的变量吗?
如果在通过串行调度队列获取所有图像之前离开当前的ViewController会发生什么?我不认为他们知道创建它们的ViewController已经消失所以当他们执行完成处理程序时会发生什么,我将图像视图插入主线程的scrollview?它会导致错误或什么?当我的ViewController消失时,如何取消串行队列上的任何剩余操作?
最好的祝福,
iphone objective-c grand-central-dispatch objective-c-blocks
我正在编写一个应用程序,用户最多可以录制6个视频片段,每个片段的持续时间为2秒.当录制视频剪辑时,用户可以使用6个按钮进行播放 - 每个剪辑一个.然后,用户可以通过在6个剪辑之间切换来录制电影.问题是,当用户按下按钮时,我需要在6个剪辑之间进行近乎瞬时的切换 - 否则会丢失播放剪辑的错觉 - 该功能有点类似于App Store中名为CamBox的应用程序.
每当用户按下按钮时,我首先尝试使用AVPlayer中的AvPlayerItem和AVAsset初始化每个剪辑.播放器的输出在我的主视图中指向AVPlayerLayer.问题是加载和开始播放所花费的时间很长,这意味着当用户快速连续按下按钮时视频会滞后.
我决定尝试使用5个AVPlayers和5个AVPlayerLayers预加载所有剪辑.5 PlayerLayers被插入到我的主视图中,当用户按下按钮时,当前正在播放的AVPlayer被暂停和倒回,并且当前可见的AVPlayerLayer被隐藏.启动新的AVPlayer并显示相应的AVPlayerLayer.它工作得比我的第一个解决方案快得多,虽然不是瞬间但问题是我只能预加载4个剪辑,这意味着当用户按下播放最后两个按钮的按钮时,它会滞后很长时间.下面是我预加载剪辑的代码
-(void)loadVideos
{
layers = [[NSMutableArray alloc] initWithCapacity:6];
players = [[NSMutableArray alloc] initWithCapacity:6];
for(int i = 1; i < 7; i++)
{
NSURL* fileURL = [NSURL fileURLWithPath:[self getFileName:i]];
AVPlayerItem* avPlayerItem = [[[AVPlayerItem alloc] initWithURL:fileURL] autorelease];
[avPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
AVPlayer *avPlayer = [[[AVPlayer alloc] initWithPlayerItem:avPlayerItem] autorelease];
[avPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
[avPlayer addObserver:self forKeyPath:@"currentItem" options:0 context:nil];
AVPlayerLayer* layer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
layer.frame = self.playerView.bounds;
[playerView.layer addSublayer:layer];
[layers addObject:layer];
[players …Run Code Online (Sandbox Code Playgroud) 我正在使用 Xcode 8 GM 并且有一个需要针对 iOS 10 更新的旧项目。
我发现我当前使用 Swift 2.2 版构建的应用商店在 iOS 10 上运行时不支持所需的界面定向功能
简单地说,当我覆盖 supportedInterfaceOrientations() 时,它在 iOS 10 上运行时永远不会被调用。
在以前的版本上它工作正常。
我可以看到签名已更改,因此 supportedInterfaceOrientations 现在是 var 而不是方法,但这似乎只适用于 Swift 3 而不适用于 Swift 2.3。当我尝试在 Swift 2.3 中作为 var 覆盖时,它不会编译,如果我使用旧签名,它在 iOS 10 下永远不会被调用
有任何想法吗?
我希望在 Flutter 中的页面之间导航时使屏幕的上半部分显示为静态。
为了尝试实现这一目标,我使用了 Hero 小部件,并将其用在包含 AppBar 和我希望在推送新页面时显示为静态的其他内容的列上。
应用栏本身保持静态,但后退箭头在动画开始时消失,并在动画完成时重新出现。
当页面的其余部分动画到位时,如何让后退箭头始终保持可见?
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Hero(
tag: 'top',
child: Column(
children: <Widget>[
AppBar(
title: Text('First'),
backgroundColor: Color.fromARGB(255, 50, 64, 182),
),
Container(
height: 80.0,
)
],
),
),
RaisedButton(
child: Text('Next'),
onPressed: () {
Navigator.pushNamed(context, '/second');
},
),
],
),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [ …Run Code Online (Sandbox Code Playgroud) 我有一个有两个页面的应用程序 - 每个页面都包含一个文本字段,第一页还包含一个“下一步”按钮,该按钮将导航到第 2 页。
我的问题是这样的:当第 1 页上的文本字段获得焦点并且我按下“下一步”按钮时,键盘将在导航到下一个屏幕之前关闭。
有没有办法抑制这种行为,以便键盘保持打开状态,而不是先关闭然后在显示第 2 页时再次打开?
flutter ×2
avfoundation ×1
avplayer ×1
ios ×1
ios10 ×1
iphone ×1
objective-c ×1
swift ×1
video ×1
xamarin ×1