2013年12月23日星期一

IOS设计模式第八篇之键值观察模式 - 人魔七七

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
IOS设计模式第八篇之键值观察模式 - 人魔七七  阅读原文»

版权声明:原创作品,谢绝转载!否则将追究法律责任。

键值观察模式:

在KVO,一个对象可以要求被通知当他的某个特殊的属性被改变了。自己或者另一个对象。如果你感兴趣你可以阅读更多的信息参考: Apple’s KVO Programming Guide.

怎么用KVO设计模式呢?

正如上面提及到的。这个KVO机制允许一个对象观察一个属性的改变。在你的例子。你可以用KVO来观察你UIImageView图片属性的改变。

打开AlbumView添加下面代码到initWithFrame:albumCover:在 [self addSubview:indicator];后面;

[coverImage addObserver:self forKeyPath:@"image" options:0 context:nil];

这个self是当前的类,作为一个观察coverImage Image属性的观察者。

在本类销毁的时候你还需要注销观察者在AlbumView实现文件里面添加下面的代码:

- (void)dealloc

{

[coverImage removeObserver:self forKeyPath:@"image"];

}

最后添加下面的方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

if ([keyPath isEqualToString:@"image"])

{

;

}}

你必须在某个观察者类里面实现这个方法。这个系统执行这个方法每次你观察你的属性改变的时候。上面的代码。当你图片属性改变的时候这个网络提示器就会改变。

编译运行你的应用这个网络提示器消失了。

Image

注意:记得要删除你的观察家们当他们收回,否则你的应用程序会崩溃当系统试图将消息发送到这些不存在的观察者!

如果你在你的应用程序并终止它,你会注意到你的应用程序的状态并没有保存。最后一个相册你看不会应用程序启动时的默认专辑。

为了纠正他你需要用下一个设计模式备忘录设计模式。


本文链接:http://www.cnblogs.com/qiqibo/p/3488775.html,转载请注明。

.Net 并行计算 ----并行Linq(一) - Wang.Crystal  阅读原文»

本文是.Net 并行计算 的第三篇 欢迎大家拍砖,阅读本文需要有LINQ基础,因为并行LINQ (PLinq) 其实是LINQ To Object 的并行实现

  • 什么是并行LINQ

PLinq 其实就是Linq to Object 的并行实现,PLINQ 会尝试充分利用系统的处理。将数据源分片之后,而后在多个处理上进行处理,这就意味着在大部分情况下运行速度会显著提高,PLINQ 通常只需向数据源添加 AsParallel()查询操作,这个还是很简单的吧 下面的例子为大家展示了这点

List<int> TestDemo = Enumerable.Range(1, 10000).ToList();
Stopwatch w1
= Stopwatch.StartNew();
var linqParallel = from c in TestDemo.AsParallel() where c % 2 == 0 select c;
int count = linqParallel.ToList().Count;
Console.WriteLine(
"并行Linq耗时" + w1.ElapsedMilliseconds + "找到偶数:" + count);

大家知道上面的例子是怎么执行的吗?其实在默认的情况下PLinq是保守的。他会先分析总体结构和的并行查询是否安全,如果并行查询性能因为并行而提高而且安全的话就会使用并行查询。否则就会顺序执行,当然你也可以直接指定使用并行查询。

var linqParallel = from c in TestDemo.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism) where c % 2 == 0 select c;
  • 影响PLINQ查询性能的因素

1.总体工作的计算开销

首先大家都明白并行化会有性能的开销所以PLINQ的查询的必须要有足够的运算来弥补这样的开开销,如果运算量很小则不适合使用PLINQ;大家看看下面的例子,才看看运行结果 是PLINQ 的时间多还是LINQ的时间多,在笔者的电脑中并行LINQ 所需时间要大于非并行LINQ

List<int> TestDemo = Enumerable.Range(1, 1000000).ToList();
Stopwatch w1 = Stopwatch.StartNew();
var linqParallel = from num in TestDemo.AsParallel() where num / 3 == 0 select num;
Console.WriteLine("并行Linq耗时" + w1.ElapsedMilliseconds );
Stopwatch w2 = Stopwatch.StartNew();
var linql = from num in TestDemo where num / 3 == 0 select num;
Console.WriteLine("非并行Linq耗时" + w2.ElapsedMilliseconds );

如果我们做如下修改,那么PLINQ的性能优势立即就显现出来了,因为在SELECT的语句有足够的工作来抵消并行带来的性能开销

private static int MyTest(int a)
{

Thread.Sleep(
1000);
Random r
= new Random(1000);
return r.Next();
}

List<int> TestDemo = Enumerable.Range(1, 100).ToList();
Stopwatch w1
= Stopwatch.StartNew();
var linqParallel = from num in TestDemo.AsParallel() where num / 3 == 0 select MyTest(num);
Console.WriteLine(
"并行Linq耗时" + w1.ElapsedMilliseconds );
Stopwatch w2
= Stopwatch.StartNew();
var linql = from num in TestDemo where num / 3 == 0 select MyTest(num);
Console.WriteLine(
"非并行Linq耗时" + w2.ElapsedMilliseconds );
Console.ReadLine();

2.系统的逻辑内核
这个地方我好想很好理解,一样代码,你在4核心机器上和8核心的机器上,肯定是8核跑的快些原因是可以在更多并行线程之间分担工作加速的总量取决于查询的总体工作中可并行化的百分比。 但是,请不要假定所有查询在八核计算机上的运行速度都比在四核计算机的运行速度快两倍在PLINQ中我们可以指定使用处理器的个数但是最多不能操过64个如下例中

var linqParallel = from num in TestDemo.AsParallel().WithDegreeOfParallelism(2) where num / 3 == 0 select MyTest(num);

3.查询的执行方式

这里在后面会讲到,现在就不说了。

4.操作数量和种类

对于必须要保持元素在源序列中的顺序的情况,PLINQ 提供了 AsOrdered 运算符。 排序会产生开销,但此开销通常是适度的。 GroupBy 和 Join 操作同样也会产生开销。 如果允许按任意顺序处理源集合中的元素,并在这些元素就绪时立即将它们传递到下一个运算符



本文链接:http://www.cnblogs.com/crystal189/p/3488494.html,转载请注明。

阅读更多内容

没有评论:

发表评论