开发者

NSThread, how to call a method with 2 param's

Im trying to use NSThread so my display pic can load in the background so im calling it by开发者_如何学运维

   [NSThread detachNewThreadSelector:@selector(displayPic:aURL :aURL2) toTarget:self withObject:nil];

But as im passing through 2 Strings, how would i construct this statement?

Thanks


Simple hack, use NSArray? Or use any other collection such as NSDictionary.

Example

NSArray *extraArgs = [[NSArray alloc] initWithObjects:string1, string2, nil];
[NSThread detachNewThreadSelector:@selector(displayPic:) toTarget:self withObject:extraArgs];
[extraArgs release];

There no proper way of doing this, as far as i am aware.


Pass an NSDictionary built using all of the arguments needed by your function as the parameter.

[NSThread detachNewThreadSelector:@selector(displayPic:) toTarget:self withObject:
     [NSDictionary dictionaryWithObjectsAndKeys: @"http://www.example.org/a.jpg", @"aURL", @"http://www.example.org/a.jpg", @"aURL2", nil]];

In the function you pass as a selector's code, you then retrieve from the dictionary the arguments you stored:

- (void) displayPic: (NSDictionary*)args
{
   NSString *aURL = [args valueForKey: @"aURL"],
            *aURL2 = [args valueForKey: @"aURL2"];

   //The rest of the code
   //...
}


Well:

There is a way of asynchronously calling arbitrary methods on objects that would go through NSOperationQueue and I would highly recommend using operation-queues over NSThreads most of the time.

Depending on the OS you are targeting (iPhone 3.x or iOS 4), this would be a one-liner or a lenghty chunk of code.

For iOS 4 behold the one-liner (assuming you have an NSOperationQueue called queue and your worker-object called worker):

[queue addOperationWithBlock:^{ [worker displayPic:url1 :url2]; }];

Note that this works on OS X 10.6 as well.

The 3.x version would require you to either subclass NSOperation or use NSInvocationOperation -- which would have been what I originally wrote.

But here's the thing:

If all you want to do is prefetching something in the background, just modify your worker to only take one URL and use that with a queue to wich you add more of these fetchers.

Then the solutions becomes easy again on 2.x:

NSInvocationOperation *workerOperation = [[NSInvocationOperation alloc] initWithTarget:worker selector:@selector(displayURL:) object:url];
[queue addOperation:workerOperation]; // retains the operation
[workerOperation release];

Hope this helps

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜